用python实现fisher线性判别实验,对于已知类别w1和w2计算最优方向W,画出W的直线并标记出投影后的点在直线上的位置,选择决策边界实现新样本xx1=(-0.7,0.58,0.089),xx2=(0.047,-0.4,1.04)的分类。
时间: 2024-12-18 18:22:26 浏览: 19
要在Python中实现Fisher线性判别并进行可视化,首先需要导入必要的库,然后创建一个简单的例子来演示。这里假设我们有两个类别(比如正负两类),并且已经有一组训练数据。我们将计算类别向量(w1和w2),然后找到最优的方向W,接着将新的样本项目xx1和xx2投影到这个线上,并进行分类。
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 假设我们有训练数据 (features, labels)
features = np.array([...]) # 三维数组,每一行是一个样本,最后一列是类别标签(0 or 1)
labels = np.array([...])
# 计算每个类别的均值和协方差矩阵
mean_1, mean_2 = features[labels == 0].mean(axis=0), features[labels == 1].mean(axis=0)
covariance = np.cov(features.T)
# Fisher准则下的协方差矩阵逆
lda_matrix = np.linalg.inv(covariance)
w = lda_matrix.dot(mean_2 - mean_1).reshape(1, -1) # 最优方向W
# 新样本
xx1 = [-0.7, 0.58, 0.089]
xx2 = [0.047, -0.4, 1.04]
# 计算投影点在直线上的位置
proj_xx1 = xx1.dot(w) / w.dot(w.T)[0]
proj_xx2 = xx2.dot(w) / w.dot(w.T)[0]
# 决策边界
decision_boundary = mean_1 + proj_xx1 * w
# 二维绘图示例
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(features[:, 0], features[:, 1], features[:, 2], c=labels)
ax.plot([mean_1[0], decision_boundary[0]], [mean_1[1], decision_boundary[1]], 'k-', label='Decision boundary')
ax.scatter(xx1[0], xx1[1], xx1[2], color='r', marker='x', label='Projected point x1')
ax.scatter(xx2[0], xx2[1], xx2[2], color='b', marker='o', label='Projected point x2')
ax.legend()
plt.show()
# 分类
if proj_xx1 > 0:
prediction_for_xx1 = 1 # 类别2
else:
prediction_for_xx1 = 0 # 类别1
if proj_xx2 > 0:
prediction_for_xx2 = 1
else:
prediction_for_xx2 = 0
print(f"Sample xx1 classified as {prediction_for_xx1}")
print(f"Sample xx2 classified as {prediction_for_xx2}")
```
注意:上述代码仅提供了一个基础的解释和伪代码,实际应用中需要对数据预处理和错误处理。
阅读全文