緊接著上篇博文,實現了冪迭代聚類演算法:
# 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=k).fit_predict(subvecs)
def normvec(vec):
"""對乙個向量進行1範數正則化
:param vec:
:return:
"""return vec / la.norm(vec, ord=1)
def pic(points, k):
"""冪迭代
:param points:
:param k:
:return:
"""n = len(points)
w = normalize(similarity(points), norm='l1')
v0 = np.zeros(n)
v1 = normvec(np.random.rand(n))
d0 = v0.copy()
d1 = v1.copy()
threshold = 1e-5 / n
while la.norm(d1 - d0, ord=np.inf) >= threshold:
v0 = v1.copy()
v1 = normvec(np.dot(w, v1))
d0 = d1.copy()
d1 = np.abs(v1 - v0)
return kmeans(n_clusters=k).fit_predict(v1.reshape(-1, 1))
# 資料
x, y = make_blobs()
labels = pic(x, 3)
# 畫圖
plt.style.use('ggplot')
# 原資料
fig, (ax0, ax1) = plt.subplots(ncols=2)
ax0.scatter(x[:, 0], x[:, 1], c=y)
ax0.set_title('raw data')
ax0.axis('equal')
# 聚類結果
ax1.scatter(x[:, 0], x[:, 1], c=labels)
ax1.set_title('power iteration clustering')
ax1.axis('equal')
plt.show()
譜聚類概述
一 簡述 聚類是對探索性資料分析最廣泛使用的技術,在現在各個科學領域中處理沒有類標的資料時,人們總是想通過確定資料中不同樣本的歸類,來獲取對資料的直觀印象。傳統的聚類方法有很多,像k means,single linkage等,但是k means演算法有些缺點,比如當樣本維度特別大的時候,k mea...
20150916譜聚類學習
什麼是譜聚類?譜聚類的思想是生成乙個帶權無向圖g。g的每個頂點表示乙個樣本,連線頂點的邊表示兩個樣本之間具有相似性,邊的權值即樣本之間的相似度大小。然後對圖進行分割,使得不同組之間的邊的相似度盡可能的小,組內邊的相似度盡可能的大。因此,譜聚類需要解決兩個問題 如何生成帶權無向圖g?如何對圖進行分割?...
機器學習 譜聚類
譜聚類,譜就是指矩陣所有的特徵值的集合 而矩陣指的是由所有資料形成的圖的laplacian矩陣。因此譜聚類就是計算資料的laplacian矩陣的特徵向量,再取特徵向量中的一部分進行kmeans聚類。but,為什麼是laplacian矩陣?為什麼不直接對原始資料kmeans聚類?這也就是譜聚類實現起來...