本文主要是介绍第三章 线性判别 -基于(二维向量投影),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
完整代码如下:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(150)
x1 = np.random.normal(7, 1, [20, 1])
x2 = np.random.normal(7, 1, [20, 1])
C0 = np.concatenate((x1, x2), axis=1).T # C0类x1 = np.random.normal(2, 1, [20, 1])
x2 = np.random.normal(2, 1, [20, 1])
C1 = np.concatenate((x1, x2), axis=1).T # C1类w = np.array([[4.], [1.]])
w = w / np.sqrt(np.dot(w.T, w)) # 这里很重要,w一定是要转换成单位向量
print("w", w)# 对C0类进行投影
P0 = (np.dot(w.T, C0)) # 该投影点是w单位向量的距离
M0 = w * (P0) # 转换成坐标点# 对C1类进行投影
P1 = (np.dot(w.T, C1)) # 该投影点是w单位向量的距离
M1 = w * (P1) # 转换成坐标点# C0的向量均值计算投影点
u0 = np.mean(C0, axis=1).reshape([2,1])
print('u0', u0)
C0_mean_len = np.dot(w.T, u0) # 均值点在w向量上的长度
C0_avg_point = w * C0_mean_len # 计算点坐标
print("M0_avg_point", C0_avg_point)
# C1的向量均值计算投影点
u1 = np.mean(C1, axis=1).reshape([2,1])
print('C1_avg', u1)
C1_mean_len = np.dot(w.T, u1) # 均值点在w向量上的长度
C1_avg_point = w * C1_mean_len # 计算点坐标
print("M1_avg_point", C1_avg_point)# 对两类点进行描点
plt.scatter(C0[0], C0[1],label="C0_Class_Point")
plt.scatter(C1[0], C1[1],label="C1_Class_Point")
plt.legend()# 画出w向量的直线
plt.plot([0, w[0][0] * 15], [0, w[1][0] * 15],linestyle = '--',label="Initial projection line")# 画出两类点的投影点
plt.scatter(M0[0], M0[1],label='C0 projection point')
plt.scatter(M1[0], M1[1],label='C1 projection point')# 画出两类均值点的投影点
plt.scatter(C0_avg_point[0], C0_avg_point[1], marker="*", c='r', s=100,label='C0 Mean point')
plt.scatter(C1_avg_point[0], C1_avg_point[1], marker="*", c='k', s=100,label='C1 Mean point')ax = plt.gca()
# ax.set_aspect(1)
# plt.show()Sw=np.dot((C0-u0),(C0-u0).T)+np.dot((C1-u1),(C1-u1).T)
w=np.dot(np.linalg.inv(Sw),(u0-u1))
print(w)
plt.plot([0,w[0][0]*60],[0,w[1][0]*60],label='Final projection line')
# plt.show()#测试一下
x1 = np.random.normal(5, 5, [1, 1])
x2 = np.random.normal(5, 5, [1, 1])
C_test=np.concatenate((x1, x2), axis=1).T # C0类
P_test= (np.dot(w.T, C_test))
print('u0', u0)
C0_mean_len = np.dot(w.T, u0) # 均值点在w向量上的长度
C1_mean_len = np.dot(w.T, u1) # 均值点在w向量上的长度if(np.square(P_test-C0_mean_len)<np.square(P_test-C1_mean_len)):plt.scatter(x1,x2, marker="^", c='m', s=100,label="C_test is C0_Class")
else:plt.scatter(x1,x2, marker="^", c='m', s=100,label="C_test is C1_Class")
plt.legend()plt.show()
结果如图:
这篇关于第三章 线性判别 -基于(二维向量投影)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!