def fit(self, X, y, L):
"""Fit the model according to the given training data.
Prameters
---------
X : array-like, shpae = [n_samples, n_features]
Training data.
y : array-like, shpae = [n_samples]
Target values (unlabeled points are marked as 0).
L : array-like, shpae = [n_samples, n_samples]
Graph Laplacian.
"""
labeled = y != 0
y_labeled = y[labeled]
n_samples, n_features = X.shape
n_labeled_samples = y_labeled.size
I = sp.eye(n_samples)
Y = sp.diags(y_labeled)
J = sp.eye(n_labeled_samples, n_samples)
K = rbf_kernel(X, gamma=self.gamma_k)
M = 2 * self.gamma_a * I \
+ 2 * self.gamma_i / n_samples**2 * L**self.p @ K
# Construct the QP, invoke solver
solvers.options['show_progress'] = False
sol = solvers.qp(
P = matrix(Y @ J @ K @ LA.inv(M) @ J.T @ Y),
q = matrix(-1 * np.ones(n_labeled_samples)),
G = matrix(np.vstack((
-1 * np.eye(n_labeled_samples),
n_labeled_samples * np.eye(n_labeled_samples)
))),
h = matrix(np.hstack((
np.zeros(n_labeled_samples),
np.ones(n_labeled_samples)
))),
A = matrix(y_labeled, (1, n_labeled_samples), 'd'),
b = matrix(0.0)
)
# Train a classifer
self.dual_coef_ = LA.solve(M, J.T @ Y @ np.array(sol['x']).ravel())
return self
评论列表
文章目录