紧接着上篇博文,实现了幂迭代聚类算法:
# encoding=utf-8
import numpy as np
import matplotlib.pyplot as plt
from numpy import linalg as LA
from sklearn.cluster import KMeans
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.preprocessing import normalize
from sklearn.datasets import make_blobs
def similarity(points):
"""
亲和矩阵
:param points:
:return:
"""
res = rbf_kernel(points)
for i in range(len(res)):
res[i, i] = 0
return res
def spectral(points, k):
"""
谱聚类
:param points:
:param k:
:return:
"""
W = similarity(points)
Dn = np.diag(np.power(np.sum(W, axis=1), -0.5))
L = np.eye(len(points)) - np.dot(np.dot(Dn, W), Dn)
eigvals, eigvecs = LA.eig(L)
indices = np.argsort(eigvals)[:k]
subvecs = normalize(eigvecs[:, indices])
return KMeans(n_clusters=