python 譜聚類 冪迭代

2021-07-25 22:45:33 字數 2080 閱讀 9272

緊接著上篇博文,實現了冪迭代聚類演算法:

# 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聚類?這也就是譜聚類實現起來...