zoukankan      html  css  js  c++  java
  • 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

    自己生成数据:

    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

     

    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

  • 相关阅读:
    进阶算子
    Scala中sortBy和Spark中sortBy区别
    简单算子演示
    map和FlatMap之间区别?
    RDD
    Spark高可用
    Django Rest Framework
    Scrapy
    asyncio
    BeautifulSoup
  • 原文地址:https://www.cnblogs.com/hustlx/p/5264333.html
Copyright © 2011-2022 走看看