[置顶] PCA主成分分析Python实现

作者:拾毅者
出处:http://blog.csdn.net/Dream_angel_Z/article/details/50760130
Github源码:https://github.com/csuldw/MachineLearning/tree/master/PCA

PCA(principle component analysis) ,主成分分析,主要是用来降低数据集的维度,然后挑选出主要的特征。原理简单,实现也简单。关于原理公式的推导,本文不会涉及,因为有很多的大牛都已经写过了,在这里主要关注下实现,算是锻炼一下自己。

本来是在复习LDA的,然后就看到了PCA,就跟着下面这篇文章的步骤,把PCA用python实现了一遍,具体的思想可以参考这篇文章,讲的通俗易懂,主要是有个实例参考,值得拥有!

  • JerryLead之PCA主成分分析

下面自己来简单的清理下思路!

PCA思想

移动坐标轴,将n维特征映射到k维上(k

基本步骤

基本步骤:

  • 对数据进行归一化处理(代码中并非这么做的,而是直接减去均值)
  • 计算归一化后的数据集的协方差矩阵
  • 计算协方差矩阵的特征值和特征向量
  • 保留最重要的k个特征(通常k

源码实现

1.首先引入numpy,由于测试中用到了pandas和matplotlib,所以这里一并加载

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.定义一个均值函数

#计算均值,要求输入数据为numpy的矩阵格式,行表示样本数,列表示特征 
def meanX(dataX):
    return np.mean(dataX,axis=0)#axis=0表示按照列来求均值,如果输入list,则axis=1

3.编写pca方法,具体解释参考注释

""" 参数: - XMat:传入的是一个numpy的矩阵格式,行表示样本数,列表示特征 - k:表示取前k个特征值对应的特征向量 返回值: - finalData:参数一指的是返回的低维矩阵,对应于输入参数二 - reconData:参数二对应的是移动坐标轴后的矩阵 """
def pca(XMat, k):
    average = meanX(XMat) 
    m, n = np.shape(XMat)
    data_adjust = []
    avgs = np.tile(average, (m, 1))
    data_adjust = XMat - avgs
    covX = np.cov(data_adjust.T)   #计算协方差矩阵
    featValue, featVec=  np.linalg.eig(covX)  #求解协方差矩阵的特征值和特征向量
    index = np.argsort(-featValue) #按照featValue进行从大到小排序
    finalData = []
    if k > n:
        print "k must lower than feature number"
        return
    else:
        #注意特征向量时列向量,而numpy的二维矩阵(数组)a[m][n]中,a[1]表示第1行值
        selectVec = np.matrix(featVec.T[index[:k]]) #所以这里需要进行转置
        finalData = data_adjust * selectVec.T 
        reconData = (finalData * selectVec) + average  
    return finalData, reconData

4.编写一个加载数据集的函数

#输入文件的每行数据都以\t隔开
def loaddata(datafile):
    return np.array(pd.read_csv(datafile,sep="\t",header=-1)).astype(np.float)

5.可视化结果

因为我将维数k指定为2,所以可以使用下面的函数将其绘制出来:

def plotBestFit(data1, data2):    
    dataArr1 = np.array(data1)
    dataArr2 = np.array(data2)

    m = np.shape(dataArr1)[0]
    axis_x1 = []
    axis_y1 = []
    axis_x2 = []
    axis_y2 = []
    for i in range(m):
        axis_x1.append(dataArr1[i,0])
        axis_y1.append(dataArr1[i,1])
        axis_x2.append(dataArr2[i,0]) 
        axis_y2.append(dataArr2[i,1])                 
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(axis_x1, axis_y1, s=50, c='red', marker='s')
    ax.scatter(axis_x2, axis_y2, s=50, c='blue')
    plt.xlabel('x1'); plt.ylabel('x2');
    plt.savefig("outfile.png")
    plt.show()  

6.测试方法

测试方法写入main函数中,然后直接执行main方法即可:

data.txt可到github中下载:data.txt

#根据数据集data.txt
def main():    
    datafile = "data.txt"
    XMat = loaddata(datafile)
    k = 2
    return pca(XMat, k)
if __name__ == "__main__":
    finalData, reconMat = main()
    plotBestFit(finalData, reconMat)

结果展示

最后的结果图如下:


[置顶] PCA主成分分析Python实现_第1张图片

蓝色部分为重构后的原始数据,红色则是提取后的二维特征!

参考文献

[1] http://www.cnblogs.com/jerrylead/archive/2011/04/18/2020209.html
[2] Wikipedia- Linear discriminant analysis
[3] Wikipedia- Principal_component_analysis

你可能感兴趣的:(python,pca,源码实现,主要成分分析)