4
我試圖實現一個拉普拉斯特徵映射算法,該算法包括:如何在這裏執行廣義特徵分解?
1)構建體的圖(I使用k近鄰和說,有到第k的邊緣最近的鄰居)
2)關聯的每個具有重量
3)限定的對角線(其是對角放置的行)
4的總和)執行的廣義特徵分解邊緣(這應該是呂=拉姆達d v,其中L和d在代碼b中計算elow)
我認爲這可以通過scipy.linalg.eig(vals)以某種方式解決,但我不明白如何正確輸入我的兩個矩陣。有人能幫助我理解如何執行廣義特徵分解步驟嗎?
import numpy as np
import random as r
from math import exp as exp
from scipy.spatial import distance
def rweights((vectors,features)):
return 1 * np.random.random_sample((vectors,features)) - 0
def vEuclidean(v, m):
return np.apply_along_axis(lambda x: distance.euclidean(v,x), 1, m)
def mEuclideans(m):
return np.apply_along_axis(lambda v: vEuclidean(v,m), 1, m)
def neighbours(vector, neigh):
size = (vector.shape[0] - neigh)
for i in range(1,size):
vector[np.argmax(vector)] = 0.0
return vector
def kNN(m, k):
me = mEuclideans(m)
return np.array(map(lambda v: neighbours(v, k), me))
def diag(m):
sums = np.sum(m,1)
(vectors,features) = m.shape
zeros = np.zeros(vectors*features).reshape((vectors,features))
for i in range(features):
zeros[i][i] = sums[i]
return zeros
def vectorWeight(v, sigma):
f = lambda x: exp((-(x)/(sigma**2)))
size = v.shape[0]
for i in range(size):
v[i] = f(v[i])
return v
def weight(m):
return np.array(np.apply_along_axis(lambda v: vectorWeight(v,0.5), 1, m))
if __name__ == "__main__":
np.random.seed(666)
m = rweights((5,3))
w = weight(kNN(m, 2))
D = diag(w)
L = D-w
數組參數'a'和'b'在'scipy.linalg.eig'的文檔字符串中解釋(http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eig的.html)。這些應該對應你的'L'和'D'。你嘗試過嗎?如果是這樣,請詳細描述您的問題。 –
@warren。那麼scipy.linalg.eig(L,D)會返回對應於lambda(文檔中的w)的特徵值,並且v(vl中的歸一化特徵向量)? – stian
使用默認參數'left = False,right = True',第二個返回值的列是(右)廣義特徵向量(文檔字符串中的'vr')。那些將是你的'v'。 –