前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习算法笔记系列之深入理解主成分分析PCA-Python实现篇

机器学习算法笔记系列之深入理解主成分分析PCA-Python实现篇

作者头像
用户7886150
修改2021-01-18 11:47:25
4830
修改2021-01-18 11:47:25
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: 使用Scikit-Learn在Python中减少维度

Author: shizhixin  Blog: http://blog.csdn.net/shizhixin  Weibo:http://weibo.com/zhixinshi  Email: zstarstone@163.com  Date: 2016-04-19  Note: 本笔记是机器学习算法笔记系列之深入理解主成分分析PCA的实现篇,有自己写的Python实现版本的PCA,同时有调用scikit-learn接口进行实现PCA。 

1 简介及处理流程 

主成分分析(PCA)算法原理请参考博客 机器学习算法笔记系列之深入理解主成分分析PCA。  为了对比,实现篇中采用开源机器学习scikit-learn也实现了PCA,具体scikit-learn的安装配置过程参考博客: Scikit-learn的安装过程 

2 源代码 

# -*- coding: utf-8 -*-

#**Author:** shizhixin

#**Blog:** http://blog.csdn.net/shizhixin

#**Weibo:**http://weibo.com/zhixinshi

#**Email:** zstarstone@163.com

#**Date:** 2016-04-14

#**Note:** 本源码是PCA算法实现篇,具体原理参考http://blog.csdn.net/shizhixin/article/details/51181379

import numpy as np

import matplotlib.pyplot as plt

from sklearn.decomposition import PCA

#const

EPSILON = 0.00001

#input:dataSet原始矩阵X;

#output:返回X的协方差矩阵,C = 1/(n-1) * X^T * X

#Note:#计算协方差矩阵,C = 1/(n-1) * X^T * X,其中X为m*n的矩阵,m为样本数,n为维度

def my_cov(dataSet):

    mean_data = np.mean(dataSet,0)

    move_mean_data = dataSet - mean_data

    my_cov = (np.dot(move_mean_data.transpose(),move_mean_data)) / (dataSet.shape[0] - 1)

    return my_cov

#input:mat_cov原始矩阵;eigV, eigVector矩阵特征值及对应的特征向量

#output:返回Ax = \lambda x是否相等,true为相等

#Note: 测试特征值是否计算正确,测试Ax = \lambda x是否相等

#注意这里两个浮点数相等的判断

def testEigh(mat_cov, eigV, eigVector):

    num_eigV = eigV.shape[0]

    for i in range(0, num_eigV):

        if (((mat_cov*eigVector[:,i]) - (eigV[i]*eigVector[:,i]))< EPSILON).all():

            return True

        else:

            return False

###########coding by myself####################

fd = open('testSet.txt')

lines = fd.readlines()

m = len(lines)

sampleDataSet = np.zeros((m,2))

for pos, line in enumerate(lines):

    numstr = line.split()

    sampleDataSet[pos, :] = map(float, numstr)

p1 = plt.subplot(121)

p1.plot(sampleDataSet[:,0],sampleDataSet[:,1],'.')

mean_sample = np.mean(sampleDataSet, 0)

move_mean_sample = sampleDataSet - mean_sample

np_cov = np.cov(move_mean_sample,rowvar=0)

my_cov_mat = my_cov(sampleDataSet)

mat_cov = np.mat(np_cov)

(eigV, eigVector) = np.linalg.eigh(mat_cov)

if not testEigh(mat_cov, eigV, eigVector):

    print('the calc of eig vector is error')

else:

    print eigVector

    pca_mat = eigVector[:,-1]

    pca_data = np.mat(move_mean_sample)*pca_mat

    recon_data = (pca_data *pca_mat.T)+mean_sample

p1.plot(recon_data[:,0],recon_data[:,1],'*')

p2 = plt.subplot(122)

p2.plot(sampleDataSet[:,0],sampleDataSet[:,1],'.')

###########coding by scikit-learn####################

X=sampleDataSet

pca = PCA(n_components=1)

pca.fit(X)

X_new = pca.transform(X)

print(pca.explained_variance_ratio_)

print X_new

XX = pca.inverse_transform(X_new)

p2.plot(XX[:,0],XX[:,1],'*')

plt.show() 

3 结果展示 

4 个人总结 

本篇用Python对PCA做了实现,一方面由于Python处于学习中,没有对PCA函数进行封装,应该参考skilearn建立一个PCA的类,类中包含获取特征值,特征向量,数据重构等内容。Python的实现中仅仅为了演示PCA的处理过程,没有考虑到算法的通用性,比如选择降维的维度,对输入的样本进行维度要求等,没有优化代码。scikit-learn的实现的确非常不错,而且有源码,想进一步学习的可以参考其源码,见参考文献。 

5 致谢文献 

scikit-learn,PCA 的skilearn源码实现,https://github.com/scikit-learn/scikit-learn/blob/51a765acfa4c5d1ec05fc4b406968ad233c75162/sklearn/decomposition/pca.pyscikit-learn,PCA 的相关介绍,http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCAscikit-learn,进一步阅读参考,http://scikit-learn.org/stable/modules/decomposition.html

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档