使用python的numpy库实现PCA算法

本文详细介绍了PCA(主成分分析)算法的原理及其在Python中的实现过程。通过具体实例展示了如何利用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


主成分分析(PCA)是一种常用的数据降维技术。下面是使用PythonNumPy实现PCA算法的详细步骤和代码示例: ### 实现步骤 1. **数据标准化**:将原始数据进行标准化处理,使得每个特征的均值为0,标准差为1。 2. **计算协方差矩阵**:计算标准化后数据的协方差矩阵。 3. **计算特征值和特征向量**:对协方差矩阵进行特征值分解,得到特征值和特征向量。 4. **选择主成分**:根据特征值的大小,选择前k个最大的特征值对应的特征向量作为主成分。 5. **数据投影**:将原始数据投影到选择的主成分上,得到降维后的数据。 ### 代码示例 ```python import numpy as np def pca(X, n_components): # 数据标准化 X_mean = np.mean(X, axis=0) X_std = np.std(X, axis=0) X_standardized = (X - X_mean) / X_std # 计算协方差矩阵 cov_matrix = np.cov(X_standardized.T) # 计算特征值和特征向量 eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # 对特征值进行排序,并获取排序后的索引 sorted_indices = np.argsort(eigenvalues)[::-1] # 选择前n_components个最大的特征值对应的特征向量 top_eigenvectors = eigenvectors[:, sorted_indices[:n_components]] # 数据投影 X_reduced = np.dot(X_standardized, top_eigenvectors) return X_reduced # 示例数据 X = np.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]]) # 降维到2维 n_components = 2 X_reduced = pca(X, n_components) print("降维后的数据:\n", X_reduced) ``` ### 代码解释 1. **数据标准化**:通过减去均值并除以标准差,将数据标准化到均值为0,标准差为1的范围。 2. **协方差矩阵**:使用`np.cov`函数计算标准化后数据的协方差矩阵。 3. **特征值和特征向量**:使用`np.linalg.eig`函数对协方差矩阵进行特征值分解。 4. **选择主成分**:根据特征值的大小,选择前`n_components`个最大的特征值对应的特征向量。 5. **数据投影**:将标准化后的数据与选择的特征向量相乘,得到降维后的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值