PCA降维
?
1.1算法流程?
假設有m個samples,每個數據有n維。
1. 計算各個feature的平均值,計μj ;(Xj(i)表示第i個樣本的第j維特征的value)
μj = Σm Xj(i)/m
meanVals = mean(dataMat, axis=0)
2. 將每一個feature scaling:將在不同scale上的feature進行歸一化;
3. 將特征進行mean normalization
Xj(i)= (Xj(i)-μj)/sj
meanRemoved = dataMat - meanVals #remove mean
4. 求n×n的協方差矩陣Σ:
covMat = cov(meanRemoved, rowvar=0)
5.求取特征值和特征向量:
[U,S,V] = SVD(Σ)
eigVals,eigVects = linalg.eig(mat(covMat))
6. 按特征值從大到小排列,重新組織U
如果使用否則的話應進行排序,并按照該次序找到對應的特征向量重新排列。
eigValInd = argsort(eigVals)?
7. 選擇k個分量
按照第五、六步中講的后,我們得到了一個n×n的矩陣Σ和U,這時,我們就需要從U中選出k個最重要的分量;即選擇前k個特征向量,即為Ureduce, 該矩陣大小為n×k
eigValInd = eigValInd[:-(topNfeat+1):-1]? #cut off unwanted dimensions
這樣對于一個n維向量x,就可以降維到k維向量z了:
?1.2、PCA降維實驗
老師給的數據swissroll.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
?
1、Y=100*random.rand(1,2000)
2、y=21*random.rand(1,2000)
2、y=1*random.rand(1,2000)
1.3、PCA
降維實驗小結
?????? 可以看到,當y的變化幅度較小時,最后降維之后的數據更類似于x,z軸數據,當y變化較大時,更類似于變化較大的y和x。
轉載于:https://www.cnblogs.com/hustlx/p/5264333.html
總結
- 上一篇: 《秋槿》第十一句是什么
- 下一篇: JQuery 动态创建表单,并自动提交