博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中pca算法_使用python的numpy库实现PCA算法
阅读量:1531 次
发布时间:2019-04-21

本文共 1340 字,大约阅读时间需要 4 分钟。

#!/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://qhkdy.baihongyu.com/

你可能感兴趣的文章
Centos7上安装docker
查看>>
Docker搭建MySQL服务
查看>>
注册中心的选择和Eurake服务搭建
查看>>
springcloud LoadBalancerClient 负载策略原理
查看>>
SpringCloud LoadBalancerClient实现负载均衡以及自定义负载策略(一个或多个)
查看>>
电脑文件远程共享设置与使用
查看>>
终极离线情况下安装docker、mysql、jdk、启动项目
查看>>
Mysql 数据库服务远程连接限制修改
查看>>
mysql多行合并成一行,值用逗号隔开
查看>>
mysql锁表解决方案
查看>>
windows安装mysql 提示:计算机丢失 MSVCr120.dll
查看>>
mysql 多个group_concat函数对应排序
查看>>
mysql 8.0 做数据文件迁移 实测可用
查看>>
centos 7 开放指定端口以及验证端口是否开放
查看>>
linux 修改连接服务器默认22端口
查看>>
linux 服务器在线扩容
查看>>
linux 服务器同步北京时间以及开机自动同步时间
查看>>
mysql 报错 Out of sort memory, consider increasing server sort buffer size
查看>>
ERROR 1054 (42S22): Unknown column ‘password‘ in ‘field list‘
查看>>
Linux sar命令详解
查看>>