LDA(线性判别分析,Python实现)
源代码:
1 #-*- coding: UTF-8 -*- 2 from numpy import * 3 import numpy 4 def lda(c1,c2): 5 #c1 第一类样本,每行是一个样本 6 #c2 第二类样本,每行是一个样本 7 8 #计算各类样本的均值和所有样本均值 9 m1=mean(c1,axis=0)#第一类样本均值 10 m2=mean(c2,axis=0)#第二类样本均值 11 c=vstack((c1,c2))#所有样本 12 m=mean(c,axis=0)#所有样本的均值 13 14 #计算类内离散度矩阵Sw 15 n1=c1.shape[0]#第一类样本数 16 print(n1); 17 n2=c2.shape[0]#第二类样本数 18 #求第一类样本的散列矩阵s1 19 s1=0 20 for i in range(0,n1): 21 s1=s1+(c1[i,:]-m1).T*(c1[i,:]-m1) 22 #求第二类样本的散列矩阵s2 23 s2=0 24 for i in range(0,n2): 25 s2=s2+(c2[i,:]-m2).T*(c2[i,:]-m2) 26 Sw=(n1*s1+n2*s2)/(n1+n2) 27 #计算类间离散度矩阵Sb 28 Sb=(n1*(m-m1).T*(m-m1)+n2*(m-m2).T*(m-m2))/(n1+n2) 29 #求最大特征值对应的特征向量 30 eigvalue,eigvector=linalg.eig(mat(Sw).I*Sb)#特征值和特征向量 31 indexVec=numpy.argsort(-eigvalue)#对eigvalue从大到小排序,返回索引 32 nLargestIndex=indexVec[:1] #取出最大的特征值的索引 33 W=eigvector[:,nLargestIndex] #取出最大的特征值对应的特征向量 34 return W