已知两类训练样本,利用感知器算法求解判别函数,并画出决策面。两类训练样本如下: X1 = np.array([[0, 0, 0], [1, 0, 0], [1, 0, 1], [1, 1, 0]]) X2 = np.array([[0, 0, 1], [0, 1, 1], [0, 1, 0], [1, 1, 1]])
时间: 2023-09-29 13:11:06 浏览: 247
感知器算法是一种经典的二分类线性判别算法。我们可以使用感知器算法来求解判别函数,并画出决策面。
首先,我们需要定义感知器算法的实现函数。
```python
import numpy as np
def perceptron(X1, X2, learning_rate=1, max_iterations=1000):
X = np.concatenate((X1, X2), axis=0)
y = np.concatenate((np.ones(len(X1)), -np.ones(len(X2))), axis=0)
n_samples, n_features = X.shape
w = np.zeros(n_features)
b = 0
iterations = 0
while iterations < max_iterations:
misclassified = False
for i in range(n_samples):
if y[i] * (np.dot(X[i], w) + b) <= 0:
w += learning_rate * y[i] * X[i]
b += learning_rate * y[i]
misclassified = True
if not misclassified:
break
iterations += 1
return w, b
```
接下来,我们可以使用给定的训练样本来运行感知器算法,并获得判别函数的权重和偏置。
```python
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
X1 = np.array([[0, 0, 0], [1, 0, 0], [1, 0, 1], [1, 1, 0]])
X2 = np.array([[0, 0, 1], [0, 1, 1], [0, 1, 0], [1, 1, 1]])
w, b = perceptron(X1, X2)
print("判别函数的权重:", w)
print("判别函数的偏置:", b)
```
现在,我们可以画出决策面。
```python
# 生成网格点
x_range = np.linspace(-0.5, 1.5, 50)
y_range = np.linspace(-0.5, 1.5, 50)
x_grid, y_grid = np.meshgrid(x_range, y_range)
# 计算决策面的 z 值
z_grid = (-w[0] * x_grid - w[1] * y_grid - b) / w[2]
# 绘制训练样本点
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(X1[:, 0], X1[:, 1], X1[:, 2], c='r', marker='o', label='Class 1')
ax.scatter(X2[:, 0], X2[:, 1], X2[:, 2], c='b', marker='o', label='Class 2')
# 绘制决策面
ax.plot_surface(x_grid, y_grid, z_grid, alpha=0.5)
ax.set_xlabel('X1')
ax.set_ylabel('X2')
ax.set_zlabel('X3')
plt.legend()
plt.show()
```
运行以上代码将会得到一个包含训练样本和决策面的图像,其中红色点表示 Class 1,蓝色点表示 Class 2。决策面是一个三维平面,它将两个类别分开。
阅读全文