机器学习算法笔记系列之深入理解主成分分析PCA-Python实现篇
来源:互联网 发布:pickit2烧写软件 编辑:程序博客网 时间:2024/05/22 04:48
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/51181379import numpy as npimport matplotlib.pyplot as pltfrom sklearn.decomposition import PCA#constEPSILON = 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_samplenp_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_samplep1.plot(recon_data[:,0],recon_data[:,1],'*')p2 = plt.subplot(122)p2.plot(sampleDataSet[:,0],sampleDataSet[:,1],'.')###########coding by scikit-learn####################X=sampleDataSetpca = PCA(n_components=1)pca.fit(X)X_new = pca.transform(X)print(pca.explained_variance_ratio_)print X_newXX = 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.py
- scikit-learn,PCA 的相关介绍,http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA
- scikit-learn,进一步阅读参考,http://scikit-learn.org/stable/modules/decomposition.html
0 0
- 机器学习算法笔记系列之深入理解主成分分析PCA-Python实现篇
- 机器学习算法笔记系列之深入理解主成分分析PCA-原理篇
- 机器学习算法笔记系列之深入理解主成分分析PCA-原理篇
- 机器学习算法笔记系列之深入理解主成分分析PCA
- 【机器学习算法-python实现】PCA 主成分分析、降维
- 【机器学习系列】python版PCA(主成分分析)
- 【机器学习】主成分(PCA)算法分析
- 【机器学习算法实现】主成分分析(PCA)——基于python+numpy
- 【机器学习算法实现】主成分分析(PCA)——基于python+numpy
- 【机器学习算法实现】主成分分析(PCA)——基于python+numpy
- 机器学习算法(降维)—主成分分析(PCA)
- 机器学习算法~主成分分析(PCA)
- 机器学习之主成分分析(PCA)
- 机器学习之线性判别分析(LDA) 主成分分析(PCA)
- 机器学习之—主成分分析(PCA)
- 机器学习---降维之PCA主成分分析法
- 机器学习之主成分分析PCA及代码示例
- 机器学习(27)【降维】之主成分分析(PCA)详解
- 百度搜索开发
- 时隔8年,再次回到CSDN,重启学习与研究之路
- 8、ROS使用C++编写一个简单的Publisher和Subscriber
- 73. Set Matrix Zeroes
- 某电商网站,研发升级和优化,一点建议
- 机器学习算法笔记系列之深入理解主成分分析PCA-Python实现篇
- IntelliJ Idea 常用快捷键列表
- 贪心算法作业之汽车加油问题
- HM编码器代码阅读(20)——与变换量化有关的其他知识
- 平衡二叉树旋转
- 9、ROS使用C++编写一个简单的Service和Client
- 文件创建 file txt java
- HDOJ(HDU) 1570 A C
- 需要投入并产出的点