主成分分析(PCA)对脑电数据进行降维

2019-04-13 12:39发布

注:本文仅作为个人附件链接所用,请勿转载。 主成分分析是降维里面常见的技术,它的求值是一个解析解,并不需要进行迭代,其主成分可由原数据直接求得。本文不讲原理,而是以一个脑电波数据的例子进行展示,该脑电波数据分为正负两个样本集各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