多维标度法(MultiDimensional Scaling,MDS),与主成分分析(Principle Component Analysis,PCA)、线性判别分析(Linear Discriminent Analysis,LDA)类似,都可以用来降维。
# D是初始距离矩阵
D=np.array([[0,411,213,219,296,397],
[411,0,204,203,120,152],
[213,204,0,73,136,245],
[219,203,73,0,90,191],
[296,120,136,90,0,109],
[ 397,152,245,191,109,0]])
N = D.shape[0]
T = np.zeros((N,N))
ss = 1.0/N**2*np.sum(D**2)
for i in range(N):
for j in range(i,N):
T[i,j] = T[j,i] = -0.5*(D[i,j]**2 -1.0/N*np.dot(D[i,:],D[i,:]) -1.0/N*np.dot(D[:,j],D[:,j])+ss)
eigVal,eigVec = np.linalg.eig(T) # eigVec 的列向量对应特征向量
X = np.dot(eigVec[:,:2],np.diag(np.sqrt(eigVal[:2]))) # 用两个特征值和特征向量,降到二维
为了能够直观地看到MDS降维方法具有的保留样本数据间的距离的特性,我们打印原始距离和重构距离:
print '原始距离','\t重构距离'
for i in range(N):
for j in range(i+1,N):
print np.str(D[i,j]),'\t\t',np.str("%.4f"%np.linalg.norm(X[i]-X[j]))
原始距离 重构距离
411 411.0730
213 213.3703
219 216.1111
296 299.8839
397 396.5059
204 206.0970
203 200.8076
120 132.0087
152 151.6636
73 76.6109
136 132.5989
245 246.1059
90 84.4350
191 190.9788
109 113.5375