【机器学习实战05】PCA降维算法

来源:互联网 发布:了解算法看哪本书 编辑:程序博客网 时间:2024/06/08 11:21

1、数据简化

  • 使得数据更易使用
  • 降低很多算法的计算开销
  • 去除噪声
  • 使得结果易懂

2、降维方法

1:主成分分析法( PrincipalComponentAnalysis, P C A )
      在 PCA中,数据从原来的坐标系转换到了新的坐标系,新坐标系的选择是由数据本身决定的。第一个新坐标轴选择的是原始数据中方差最大的方向,第二个新坐标轴的选择和第一个坐标轴正交且具有最大方差的方向。该过程一直重复,重复次数为原始数据中特征的数目。我们会发现,大部分方差都包含在最前面的几个新坐标轴中。因此,我们可以忽略余下的坐标轴,即对数据进行了降维处理。

2:因子分析(Factor Analysis)
      在因子分析中,我们假设在观察数据的生成 中 有一 些观察 不 到的隐 变量 ( latentvariable )。假设观察数据是这些隐变量和某些噪声的线性组合 。那么隐变量的数据可能比观察数据的数目少,也就是说通过找到隐变量就可以实现数据的降维。

3:独立成分分析(Independent Component Analysis, ICA)
      ICA假设数据是从 N 个数据源生成的,这一点和因子分析有些类似。 假设数据为多个数据源的混合观察结果,这些数据源之间在统计上是相互独立的,而在 ? 0
人中只假设数据是不相关的。同因子分析一样,如果数据源的数目少于观察数据的数目,则可以实现降维过程。

3、PCA降维算法:

#encoding:utf-8from numpy import *#导入数据集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)#PCA算法:第一个参数为数据集,第二个参数topNfeat为可选参数,即应用的N个特征,#        如果不指定topNfeat的值,那么函数就会返回前9999999个特征,或者原始数据中的全部特征def pca(dataMat, topNfeat=9999999):    meanVals = mean(dataMat, axis=0) #求平均值    meanRemoved = dataMat - meanVals #减去平均值    covMat = cov(meanRemoved, rowvar=0)#计算协方差矩阵及其特征值    eigVals,eigVects = linalg.eig(mat(covMat))    #argsort()函数对特征值进行从小到大的排序    eigValInd = argsort(eigVals)                eigValInd = eigValInd[:-(topNfeat+1):-1]      redEigVects = eigVects[:,eigValInd]      #将数据转换到新空间         lowDDataMat = meanRemoved * redEigVects#transform data into new dimensions     reconMat = (lowDDataMat * redEigVects.T) + meanVals    return lowDDataMat, reconMat#测试:dataMat = loadDataSet('testSet.txt')print dataMatprint "\n"lowDDataMat, reconMat = pca(dataMat, 1)shape = shape(lowDDataMat)#降维之后的矩阵print shape#print lowDDataMat, reconMat 

Output:

[[  8.308822   7.097007] [  6.529876   5.439456] [  9.844608   9.044897] ...,  [  9.021999  10.705525] [  8.756769   8.246693] [  8.36421    8.723832]](1000, 1)

绘制原始数据点:

#encoding:utf-8from numpy import *import matplotlibimport matplotlib.pyplot as plt#创建1000个随机数据点n = 1000 xcord0 = []ycord0 = []xcord1 = []ycord1 = []markers =[]colors =[]fw = open('testSet.txt','w')#将数据点的坐标写入testSet.txt文件中for i in range(n):    [r0,r1] = random.standard_normal(2)    fFlyer = r0 + 9.0    tats = 1.0*r1 + fFlyer + 0    xcord0.append(fFlyer)    ycord0.append(tats)    fw.write("%f\t%f\n" % (fFlyer, tats))fw.close()fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(xcord0,ycord0, marker='^', s=90)plt.xlabel('hours of direct sunlight')plt.ylabel('liters of water')plt.show()

这里写图片描述
绘制PCA降维后的数据点:

from numpy import *import matplotlibimport matplotlib.pyplot as pltimport pcadataMat = pca.loadDataSet('testSet.txt')lowDMat, reconMat = pca.pca(dataMat, 1)fig = plt.figure()ax = fig.add_subplot(111)ax.scatter(dataMat[:,0], dataMat[:,1], marker='^', s=90)ax.scatter(reconMat[:,0], reconMat[:,1], marker='o', s=50, c='red')plt.show()

这里写图片描述

注意:数据点的产生是随机的,所以对于数据点的绘制图形也是随机的。

0 0
原创粉丝点击