1. 程式人生 > >python實現周志華西瓜書《機器學習》習題3.5LDA判別

python實現周志華西瓜書《機器學習》習題3.5LDA判別

本題感謝大神 https://blog.csdn.net/Snoopy_Yuan/article/details/64443841

#抄https://blog.csdn.net/Snoopy_Yuan/article/details/64443841
import numpy as np
import pandas as pd
inputfile='/Users/huatong/PycharmProjects/Data/xiguaexcel.xls'
data_original=pd.read_excel(inputfile)
x=data_original.values[:,1:3]
y=data_original.values[:,3
] #計算均值向量μ u=[] for i in range(2): #2個分類的樣本分別求均值,μ0,μ1各包含兩個元素, u.append(np.mean(x[y==i],axis=0)) #append用於在列表末端增加新的物件,x[y==i]是y=0或=1的所有樣本,axis=0輸出是一行,即求每列的均值 #計算類內散度矩陣Sw m,n=np.shape(x) #m n是矩陣的維度,17行2列 sw=np.zeros((n,n)) #2維陣列,協方差矩陣的維度和陣列的列數相同 for i in range(m): x_tmp=x[i].reshape(n,1) #將x的每行資料轉為n行1列
if y[i]==0:u_tmp=u[0].reshape(n,1) if y[i]==1:u_tmp=u[1].reshape(n,1) sw+=np.dot(x_tmp-u_tmp,(x_tmp-u_tmp).T) #dot是矩陣相乘 sw=np.mat(sw) #轉為矩陣 #計算w,對Sw做奇異值分解,但python的svd得出的V是轉置後的,sigma只有對角線元素 u,sigma,v=np.linalg.svd(sw) #求Sw^-1,inv是求逆矩陣,diag是根據對角線元素建立對角矩陣 sw_inv=v.T*np.linalg.inv(np.diag(sigma))*u.T w=np.dot(sw_inv,(u[0
]-u[1]).reshape(n,1)) print(w)