注:本文仅作为个人附件链接所用,请勿转载。
主成分分析是降维里面常见的技术,它的求值是一个解析解,并不需要进行迭代,其主成分可由原数据直接求得。本文不讲原理,而是以一个脑电波数据的例子进行展示,
该脑电波数据分为正负两个样本集各52个样本,每个样本的维数为59维,全部放在一个文件里面,其对应的标签也放在一个文件里面(见数据 {MOD}链接),现对该脑电数据进行主成分分析降维,要求提取特征值最大的前面两个维度在平面坐标系上画出来。使用python语言实现。
# -*- coding:utf-8 -*-
__author__ = 'gf'
import numpy as np
from pylab import *
import matplotlib.pyplot as plt
A = np.zeros((59,104),dtype=float)
f = open('D:\mydata\mydata.txt') #打开数据文件文件
lines = f.readlines() #把全部数据文件读到一个列表lines中
A_row = 0 #表示矩阵的行,从0行开始
for line in lines: #把lines中的数据逐行读取出来
list = line.strip('
') #处理逐行数据:strip表示把头尾的'
'去掉,split表示以空格来分割行数据,然后把处理后的行数据返回到list列表中 #然后方阵A的下一行接着读
list=list.strip(' ')
list=list.split()
A[A_row:]=list[0:104]
#print(list)
A_row+=1
#print(A.shape)
meanVals = np.mean(A) # 第一步:求均值
meanRemoved = A - meanVals # 减去对应的均值
#print(meanRemoved)
covMat = np.cov(meanRemoved) # 第二步,求特征协方差矩阵
#print(covMat)
eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 第三步,求特征值和特征向量
#print(eigVals)
#print(eigVals.shape)
#print(eigVects)
eigValInd = np.argsort(eigVals) # 第四步,将特征值按照从小到大的顺序排序
eigValInd = eigValInd[: -(2+1): -1] # 选择其中较大的K个
redEigVects = eigVects[:, eigValInd] # 然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵.
#print(redEigVects)
lowDDataMat = redEigVects.T*meanRemoved # 第五步,将样本点投影到选取的特征向量上,得到降维后的数据
reconMat = (redEigVects*lowDDataMat) + meanVals # 还原数据
#contribution = self.calc_single_contribute(eigVals, eigValInd) # 计算单维贡献度,总贡献度为其和
#print(lowDDataMat)
#print(lowDDataMat.shape)
#print(reconMat)
#print(reconMat.shape)
#print(lowDDataMat[0][103])
listc = matrix.getA(lowDDataMat)
print(listc)
X_T=[[0 for x in range(1)] for y in range(52)]
Y_T=[[0 for x in range(1)] for y in range(52)]
X_F=[[0 for x in range(1)] for y in range(52)]
Y_F=[[0 for x in range(1)] for y in range(52)]
for i in range(52):
X_T[i]=listc[0][i]
print(X_T)
for i in range(52):
Y_T[i]=listc[1][i]
print(Y_T)
for i in range(52):
X_F[i]=listc[0][i+52]
print(X_F)
for i in range(52):
Y_F[i]=listc[1][i+52]
print(Y_F)
plt.scatter(X_T,Y_T,c='red',marker='o',label='True',s=40)
plt.scatter(X_F,Y_F,c='g',marker='*',label='False',s=40)
plt.legend(loc = 'upper right')
plt.title('PCA for 1th and 2th')
plt.show()
运行结果:
脑电数据链接:
链接:https://pan.baidu.com/s/1CNgh4qTnD4lw_uomj2FoWQ
密码:6c2y