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)

猜你喜欢

转载自blog.csdn.net/catherined/article/details/82592587