国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Python > 正文

python實現拉普拉斯特征圖降維示例

2024-09-09 19:02:48
字體:
來源:轉載
供稿:網友

這種方法假設樣本點在光滑的流形上,這一方法的計算數據的低維表達,局部近鄰信息被最優的保存。以這種方式,可以得到一個能反映流形的幾何結構的解。

步驟一:構建一個圖G=(V,E),其中V={vi,i=1,2,3…n}是頂點的集合,E={eij}是連接頂點的vi和vj邊,圖的每一個節點vi與樣本集X中的一個點xi相關。如果xi,xj相距較近,我們就連接vi,vj。也就是說在各自節點插入一個邊eij,如果Xj在xi的k領域中,k是定義參數。

步驟二:每個邊都與一個權值Wij相對應,沒有連接點之間的權值為0,連接點之間的權值:

步驟三: ,實現廣義本征分解:

使 是最小的m+1個本征值。忽略與 =0相關的本征向量,選取另外m個本征向量即為降維后的向量。

1、python實現拉普拉斯降維

def laplaEigen(dataMat,k,t):  m,n=shape(dataMat)  W=mat(zeros([m,m]))  D=mat(zeros([m,m]))  for i in range(m):  k_index=knn(dataMat[i,:],dataMat,k)  for j in range(k):   sqDiffVector = dataMat[i,:]-dataMat[k_index[j],:]   sqDiffVector=array(sqDiffVector)**2   sqDistances = sqDiffVector.sum()   W[i,k_index[j]]=math.exp(-sqDistances/t)   D[i,i]+=W[i,k_index[j]]  L=D-W  Dinv=np.linalg.inv(D)  X=np.dot(D.I,L)  lamda,f=np.linalg.eig(X) return lamda,f def knn(inX, dataSet, k):  dataSetSize = dataSet.shape[0]  diffMat = tile(inX, (dataSetSize,1)) - dataSet  sqDiffMat = array(diffMat)**2  sqDistances = sqDiffMat.sum(axis=1)  distances = sqDistances**0.5  sortedDistIndicies = distances.argsort() return sortedDistIndicies[0:k] dataMat, color = make_swiss_roll(n_samples=2000) lamda,f=laplaEigen(dataMat,11,5.0) fm,fn =shape(f) print 'fm,fn:',fm,fn lamdaIndicies = argsort(lamda) first=0 second=0 print lamdaIndicies[0], lamdaIndicies[1] for i in range(fm):  if lamda[lamdaIndicies[i]].real>1e-5:  print lamda[lamdaIndicies[i]]  first=lamdaIndicies[i]  second=lamdaIndicies[i+1]  break print first, second redEigVects = f[:,lamdaIndicies] fig=plt.figure('origin') ax1 = fig.add_subplot(111, projection='3d') ax1.scatter(dataMat[:, 0], dataMat[:, 1], dataMat[:, 2], c=color,cmap=plt.cm.Spectral) fig=plt.figure('lowdata') ax2 = fig.add_subplot(111) ax2.scatter(f[:,first], f[:,second], c=color, cmap=plt.cm.Spectral) plt.show() 

2、拉普拉斯降維實驗

用如下參數生成實驗數據存在swissdata.dat里面:

def make_swiss_roll(n_samples=100, noise=0.0, random_state=None):  #Generate a swiss roll dataset.  t = 1.5 * np.pi * (1 + 2 * random.rand(1, n_samples))  x = t * np.cos(t)  y = 83 * random.rand(1, n_samples)  z = t * np.sin(t)  X = np.concatenate((x, y, z))  X += noise * random.randn(3, n_samples)  X = X.T  t = np.squeeze(t) return X, t 

實驗結果如下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安远县| 凉山| 孙吴县| 宝丰县| 贵溪市| 河南省| 神池县| 太和县| 延川县| 嫩江县| 崇义县| 玉屏| 德阳市| 沈丘县| 东乡| 乳山市| 光山县| 东阳市| 二手房| 玛多县| 舟山市| 孙吴县| 读书| 五家渠市| 柏乡县| 建昌县| 淳安县| 河曲县| 开江县| 京山县| 广元市| 奇台县| 田东县| 页游| 永吉县| 铁岭县| 喜德县| 邹平县| 景德镇市| 南昌市| 大宁县|