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

1、数据简化

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

2、降维方法

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

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

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

3、PCA降维算法:

#encoding:utf-8

from 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 dataMat

print "\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-8

from numpy import *
import matplotlib
import 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()

【机器学习实战05】PCA降维算法_第1张图片
绘制PCA降维后的数据点:


from numpy import *
import matplotlib
import matplotlib.pyplot as plt
import pca

dataMat = 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()

【机器学习实战05】PCA降维算法_第2张图片

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

你可能感兴趣的:(机器学习实战,Python,机器学习实战)