通过W(X)线性判别函数,判断样本的所属类别。
代码如下:
import numpy as np
#类别1
X1 = np.mat([[13.85,2.79,7.8,49.6],[22.31,4.67,12.31,47.8],[28.82,4.63,16.18,62.15],[15.29,3.54,7.5,43.20],[28.79,4.9,16.12,58.10]])
#类别2
X2 = np.mat([[2.18,1.06,1.22,20.60],[3.85,0.8,4.06,47.10],[11.40,0,3.5,0],[3.66,2.42,2.14,15.1],[12.1,0,5.68,0]])
X3=np.mat([[8.85,3.38,5.17,26.10],[28.6,2.4,1.2,127],[20.7,6.7,7.6,30.2],[7.9,2.4,4.3,33.2],[3.19,3.2,1.43,9.9],[12.4,5.1,4.43,24.6],[16.8,3.4,2.31,31.3],[15,2.7,5.02,64]])
def average(dataset):#计算均值矩阵
ave = []
a, b = np.shape(dataset)
for i in range(b):
n = np.sum(dataset[:,i]) / a
ave.append(n)
return np.array(ave)
def compute_sw(dataset, ave):#计算单一类组内离差阵
sw = 0
a, b = np.shape(dataset)
for i in range(a):
sw += np.dot((dataset[i,:] - ave).T, dataset[i,:] - ave)
return np.array(sw)
x1_sw = compute_sw(X1, average(X1))
x2_sw = compute_sw(X2, average(X2))
x12=(average(X1)+average(X2))/2
Sw = (x1_sw + x2_sw)/3#计算合并样本协查阵
pinv = np.linalg.pinv(Sw)#计算合并样本协查阵的逆
c,d=np.shape(X3)
for i in range(c):
wx=np.dot((X3[i,:]-x12),np.dot(pinv,(average(X1)-average(X2)).T))#线性叛别函数
print(wx)
if wx>0:
print("第")
print(i+1)
print("个样本属于含钾盐泉")
else:
print("第")
print(i+1)
print("个样本属于含钠盐泉")
运行结果如下图: