机器学习线性分类器的LDA分类器的代码实现,由于要进行可视化的展现,所以这里我使用二变量进行二分类的任务,由于书上几乎都会给出它的推导过程所以在这里就省略掉它的过程推导,从使用层面上进行描述和编程语言进行实现。
# my LDA funciton
import numpy as np
import matplotlib.pyplot as plt
# 这个仅限于二维的方式
def my_LDA(X,Y):
x_0 = X[np.where(Y == 0)[0],:]
#y_0 = Y[np.where(Y == 0),:]
x_1 = X[np.where(Y == 1)[0],:]
#y_1 = Y[np.where(Y == 1),:]
x0 = x_0.mean(axis = 0)
x1 = x_1.mean(axis = 0)
SW = np.zeros([x_0.shape[1],x_0.shape[1]])
for i in range(x_0.shape[0]):
for j in range(x_0.shape[1]):
for k in range(x_0.shape[1]):
SW[j,k] = SW[j,k] + (x_0[i,j]-x0[j])*(x_0[i,k]-x0[k])
for i in range(x_1.shape[0]):
for j in range(x_0.shape[1]):
for k in range(x_0.shape[1]):
SW[j,k] = SW[j,k] + (x_1[i,j]-x1[j])*(x_1[i,k]-x1[k])
#返回的值是超平面的垂直方向和 过垂直面的一个点
return np.dot(np.linalg.inv(SW), (x0-x1)), 1/2*(x0+x1)
x = np.random.random([30,2])
x1 = x + 0.5*np.random.random([30,2])+0.1
x0 = x - 0.5*np.random.random([30,2])-0.1
X = np.concatenate((x1, x0),axis = 0)
Y = np.zeros([60,1],dtype= np.int8)
Y[0:30,0] = 1
w , zuobiao = my_LDA(X,Y)
k = -w[0]/w[1]
b = zuobiao[1] - zuobiao[0]*k
plt.Figure(figsize = (10,8))
plt.plot(x1[:,0],x1[:,1],'r*',label = 'positive')
plt.plot(x0[:,0],x0[:,1],'b+',label = 'negatiive')
plt.plot([0,b],[1.5,1.5*k+b],color = 'black',linestyle = '--',label = r'超平面')
plt.legend(['positive','negatiive', r'超平面'])
结果展示:
通过画图可以看出,我们的分界面可以很好的区分这两类问题,简单来说就是二分类的问题。易知有2个红色的点被分错,1个蓝色的点被分错,其他的点都是分类正确的,而我们总体使用的样本为60个,所以该分类器的分类准确率为57/60 = 95%,可以认为这是一个比较好的结果。