标签: 机器学习pcapython
2014-07-17 09:40 4036人阅读 评论(4) 收藏 举报git
本文章已收录于: github
机器学习知识库算法
版权声明:本文为博主原创文章,未经博主容许不得转载。app
目录(?)[+]机器学习
1.背景
PCA(Principal Component Analysis),PAC的做用主要是下降数据集的维度,而后挑选出主要的特征。函数
PCA的主要思想是移动坐标轴,找到方差最大的方向上的特征值,什么叫方差最大的方向的特征值呢。就像下图中的曲线B,同样,它的覆盖范围最广。学习

基本步骤:(1)首先计算数据集的协方差矩阵spa
(2)计算协方差矩阵的特征值和特征向量.net
(3)保留最重要的n个特征
what is 协方差矩阵:
定义是变量向量减去均值向量,而后乘以变量向量减去均值向量的转置再求均值。例如x是变量,μ是均值,协方差矩阵等于E[(x-μ)(x-μ)^t],物理意义是这样的,例如x=(x1,x2,...,xi)那么协方差矩阵的第m行n列的数为xm与xn的协方差,若m=n,则是xn的方差。若是x的元素之间是独立的,那么协方差矩阵只有对角线是有值,由于x独立的话对于m≠n的状况xm与xn的协方差为0。另外协方差矩阵是对称的。
能够参考wiki:(http://zh.wikipedia.org/wiki/%E5%8D%8F%E6%96%B9%E5%B7%AE%E7%9F%A9%E9%98%B5)
2.代码实现
伪代码以下(摘自机器学习实战):

[python] view plain copy
print?
- '''''
- @author: Garvin
- '''
- from numpy import *
- import matplotlib.pyplot as plt
-
- def loadDataSet(fileName, delim='\t'):
- fr = open(fileName)
- stringArr = [line.strip().split(delim) for line in fr.readlines()]
- datArr = [map(float,line) for line in stringArr]
- return mat(datArr)
-
- def pca(dataMat, topNfeat=9999999):
- meanVals = mean(dataMat, axis=0)
- meanRemoved = dataMat - meanVals #remove mean
- covMat = cov(meanRemoved, rowvar=0)
- eigVals,eigVects = linalg.eig(mat(covMat))
- eigValInd = argsort(eigVals) #sort, sort goes smallest to largest
- eigValInd = eigValInd[:-(topNfeat+1):-1] #cut off unwanted dimensions
- redEigVects = eigVects[:,eigValInd] #reorganize eig vects largest to smallest
- lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions
- reconMat = (lowDDataMat * redEigVects.T) + meanVals
- return lowDDataMat, reconMat
-
- def plotBestFit(dataSet1,dataSet2):
- dataArr1 = array(dataSet1)
- dataArr2 = array(dataSet2)
- n = shape(dataArr1)[0]
- n1=shape(dataArr2)[0]
- xcord1 = []; ycord1 = []
- xcord2 = []; ycord2 = []
- xcord3=[];ycord3=[]
- j=0
- for i in range(n):
-
- xcord1.append(dataArr1[i,0]); ycord1.append(dataArr1[i,1])
- xcord2.append(dataArr2[i,0]); ycord2.append(dataArr2[i,1])
- fig = plt.figure()
- ax = fig.add_subplot(111)
- ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
- ax.scatter(xcord2, ycord2, s=30, c='green')
-
- plt.xlabel('X1'); plt.ylabel('X2');
- plt.show()
-
-
-
-
- if __name__=='__main__':
- mata=loadDataSet('/Users/hakuri/Desktop/testSet.txt')
- a,b= pca(mata, 2)
loadDataSet函数是导入数据集。
PCA输入参数:参数一是输入的数据集,参数二是提取的维度。好比参数二设为1,那么就是返回了降到一维的矩阵。
PCA返回参数:参数一指的是返回的低维矩阵,对应于输入参数二。参数二对应的是移动坐标轴后的矩阵。
上一张图,绿色为原始数据,红色是提取的2维特征。

3.代码下载
下载地址:请点击我
/********************************
* 本文来自博客 “李博Garvin“
* 转载请标明出处:http://blog.csdn.net/buptgshengod
******************************************/