2015-12-09 24 views
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 
+0

數組參數'a'和'b'在'scipy.linalg.eig'的文檔字符串中解釋(http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eig的.html)。這些應該對應你的'L'和'D'。你嘗試過嗎?如果是這樣,請詳細描述您的問題。 –

+0

@warren。那麼scipy.linalg.eig(L,D)會返回對應於lambda(文檔中的w)的特徵值,並且v(vl中的歸一化特徵向量)? – stian

+0

使用默認參數'left = False,right = True',第二個返回值的列是(右)廣義特徵向量(文檔字符串中的'vr')。那些將是你的'v'。 –

回答

0

好, 此答案由沃倫的幫助(所以他應得的信貸)的幫助,但我發現了一個視頻譜聚類https://www.youtube.com/watch?v=Ln0mgyvXNQE,他在圖表上使用拉普拉斯。我認爲,根據他的結果檢查我的執行情況會很好。因此,我說:

from scipy.linalg import eig  

def distanceM(): 
    return np.array([[0.0,0.8,0.6, 0.1,0.0,0.0], 
    [0.8,0.0,0.9,0.0,0.0,0.0], [0.6,0.9,0.0,0.0,0.0,0.2], 
    [0.1,0.0,0.0,0.0,0.6,0.7],[0.0,0.0,0.0,0.6,0.0,0.8] 
    [0.0,0.0,0.2,0.7,0.8,0.0]]) 

if __name__ == "__main__": 
    w = distanceM() 
    D = diag(w) 
    L = D-w 
    w,vr = eig(L) 
    print vr 

我發現我得到同樣的拉普拉斯矩陣,也同樣的特徵向量(第二輪自願退休的列)。