源代碼:
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
