使用python的numpy库实现PCA算法

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from numpy import *  

#参数1:特征值向量,
#参数2:比率
#返回值:k(符合指定比率的topK k值)
def setK(eigVals,rate = 0.9):
    eigValInd = argsort(eigVals)  #对特征值进行排序
    for i in range(1,eigVals.size+1):
        topK = eigValInd[:-(i + 1):-1]
        eigVal = eigVals[:, topK]
        a = eigVal.sum()
        b = eigVals.sum()
        print a/b
        if a/b >= rate:
            break;
    return i

#功能:给定一个矩阵,返回 经PCA算法降过维的 矩阵(降维的程度由rate决定)
#     如果要指定k,可直接修改这条语句“ k = setK(eigVals,rate)”
#参数1:矩阵
#参数2:要取特征值的比率(rate = sum(topK特征值)/sum(特征值总和))
#返回值:经PCA算法降过维的 矩阵
def pca(dataMat, rate=0.9):  
    meanVals = mean(dataMat, axis=0)
    meanRemoved = dataMat - meanVals #减去均值
    stded = meanRemoved / std(dataMat) #用标准差归一化
    covMat = cov(stded, rowvar=0) #求协方差方阵
    eigVals, eigVects = linalg.eig(mat(covMat)) #求特征值和特征向量
    k = setK(eigVals,rate)   #get the topNfeat
    eigValInd = argsort(eigVals)  #对特征值进行排序
    eigValInd = eigValInd[:-(k + 1):-1]  #get topNfeat
    redEigVects = eigVects[:, eigValInd]       # 除去不需要的特征向量
    lowDDataMat = stded * redEigVects    #求新的数据矩阵
    #reconMat = (lowDDataMat * redEigVects.T) * std(dataMat) + meanVals  #对矩阵还原
    return lowDDataMat

a = array([[2.5,2.4],[0.5,0.7],[2.2,2.9],[1.9,2.2],[3.1,3.0],[2.3,2.7],[2,1.6],[1,1.1],[1.5,1.6],[1.1,0.9]])
print "a:"
print a
print pca(a,0.9)

#eigVals = array([3.735,1.133,0.457,0.323,0.199,0.153])
#print setK(eigVals,0.6)

下面的链接把PCA的原理解释地非常好:

http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html

投影:某一点在某个向量上的投影等于 这点的坐标 点乘 向量的单位向量。

方阵的特征值和特征向量:http://baike.baidu.com/link?url=kGEI3eUtEDlY2QxKhKu5NW_PuwJV26-b_GdXrWHxFQFc-usMO8Bw04TEWgVVd-Ne

协方差:http://zh.wikipedia.org/zh-cn/%E5%8D%8F%E6%96%B9%E5%B7%AE


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值