def sdp_km(D, n_clusters):
ones = np.ones((D.shape[0], 1))
Z = cp.Semidef(D.shape[0])
objective = cp.Maximize(cp.trace(D * Z))
constraints = [Z >= 0,
Z * ones == ones,
cp.trace(Z) == n_clusters]
prob = cp.Problem(objective, constraints)
prob.solve(solver=cp.SCS, verbose=False)
Q = np.asarray(Z.value)
rs = Q.sum(axis=1)
print('Q', Q.min(), Q.max(), '|',
rs.min(), rs.max(), '|',
np.trace(Q), np.trace(D.dot(Q)))
print('Final objective', np.trace(D.dot(Q)))
return np.asarray(Z.value)
评论列表
文章目录