譜聚類及其創新思考(python)

#譜聚類
'''
對樣本求相似性矩陣, 其實就是把每個sample當作一個node,構建一個圖關係。
1 求向量之間的關係有很多方法 比如 F1範數, F2範數, 無窮範數,餘弦  f(x1, x2)---> scalar
如果大家想改進的話這裏我建議可以用度量學習的技巧去替換求向量之間關係的方法
'''
import numpy as np
def distance(x1, x2):
    dis = 0
    for i in range(x1.shape[0]):
        dis += (x1[i] - x2[i]) ** 2
    return np.e ** (-np.sqrt(dis)/2)

# 很顯然是兩個類(1, 0, 1)&(1, 5, 0)  (100, 100, 100)&(99, 100, 99)
x = np.array([[1, 0, 1], [1, 5, 0], [100, 100, 100], [99, 100, 99]])
# 構建一個W:= 相似度矩陣
W = np.zeros((4, 4))

for i in range(x.shape[0]):
    for j in range(x.shape[0]):
        W[i][j] = distance(x[i], x[j])
# 對稱陣有很多好的性質,1.存儲數據的時候能節省接近一半的資源,2.是方陣可以求逆矩陣, 3.有n個不同的特徵值與特徵向量
#print(W)

'''
求度矩陣D之後就求拉普拉斯矩陣了 拉普拉斯矩陣爲L= D - W純粹爲巧合,在推導式時出發點爲拉普拉斯算子即我們求離散數據的每個節點的勢
拉普拉斯矩陣的每一行代表了圖中每個節點的收益。(節點做一次差其實對應了求一次導數, 二階導數爲節點做兩次差的和)
'''
D = np.zeros((4, 4))
D[0][0] = np.sum(W, axis=0)[0]
D[1][1] = np.sum(W, axis=0)[1]
D[2][2] = np.sum(W, axis=0)[2]
D[3][3] = np.sum(W, axis=0)[3]
#print(D)

L = np.zeros((4, 4))
L = D - W
#print(L)

'''
1. 類似於降維,但是這裏很多博客表述的並不對,首先我們沒有將求出的特徵向量組成的矩陣對原始矩陣進行矩陣乘法,降低維度
2. 這裏我只用了一個向量
'''
eigenvalue, featurevector = np.linalg.eig(L)
f_v = featurevector[:, np.argmax(eigenvalue)]

print(f_v) 
# [ 1.92585366e-38  8.23138568e-38  7.07106781e-01 -7.07106781e-01]
# 結果很顯然 前兩個是一對,後兩個是一對 我們的維度很低 沒必要用k-means 如果你想創新可以換一個聚類方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章