PCA降维及其实现



1.1算法流程 

假设有msamples,每个数据有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的协方差矩阵Σ:

image

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

image

这样对于一个n维向量x,就可以降维到k维向量z了:

image

 1.2PCA降维实验

老师给的数据swissroll.dat

imageimage

自己生成数据:

<span style="font-size:14px;"><span style="font-size:14px;">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</span></span>

 

1Y=100*random.rand(1,2000)

imageimage

2y=21*random.rand(1,2000)

imageimage

2y=1*random.rand(1,2000)

imageimage

1.3PCA降维实验小结

       可以看到,当y的变化幅度较小时,最后降维之后的数据更类似于xz轴数据,当y变化较大时,更类似于变化较大的yx


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值