1. (论述题)(共1题,100分)
假设平面坐标系上有四个点,要求构建单层感知器实现分类。
(3,3),(4,3) 两个点的标签为1;
(1,1),(0,2) 两个点的标签为-1。
思路:要分类的数据是2维数据,需要2个输入节点,把神经元的偏置值也设置成一个节点(偏置也是一个输入,恒等于1),总共有3个输入节点。
输入数据有4组:
(1,3,3),(1,4,3),(1,1,1),(1,0,2)
对应的标签为(1,1,-1,-1)
初始化权值w0,w1,w2取-1到1的随机数;
学习率设为0.11;
激活函数为sign函数。
我的答案:
1. 初始化:
- (1)输入数据:X=[[1,3,3],[1,4,3],[1,1,1],[1,0,2]];
- (2)标签:Y=[1,1,-1,-1]
- (3)权值向量:W=[w0,w1,w2],随机在[-1,1]中;
- (4)学习率:η= 0.11
2.激活函数:
- sign(x) = 1 if x > 0 else -1
3.训练过程
- (1)前向传播:神经元输出:
- (2)计算误差:
- (3)更新权值:
- (4)若未达到“所有样本均正确分类/达到最大迭代次数”,则重复(1)~(3)
4.迭代过程:
可通过程序代码,进行迭代:(其中一次迭代如下):
初始权值: [ 0.58717924 -0.64675996 0.79238846]
=== 第 1 轮迭代 ===
样本: [1 1 1], 标签: -1, 预测: 1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [-0.22 -0.22 -0.22]
更新后的权值: [ 0.36717924 -0.86675996 0.57238846]
样本: [1 0 2], 标签: -1, 预测: 1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [-0.22 -0. -0.44]
更新后的权值: [ 0.14717924 -0.86675996 0.13238846]
=== 第 2 轮迭代 ===
样本: [1 3 3], 标签: 1, 预测: -1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [0.22 0.66 0.66]
更新后的权值: [ 0.36717924 -0.20675996 0.79238846]
样本: [1 1 1], 标签: -1, 预测: 1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [-0.22 -0.22 -0.22]
更新后的权值: [ 0.14717924 -0.42675996 0.57238846]
样本: [1 0 2], 标签: -1, 预测: 1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [-0.22 -0. -0.44]
更新后的权值: [-0.07282076 -0.42675996 0.13238846]
=== 第 3 轮迭代 ===
样本: [1 3 3], 标签: 1, 预测: -1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [0.22 0.66 0.66]
更新后的权值: [0.14717924 0.23324004 0.79238846]
样本: [1 1 1], 标签: -1, 预测: 1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [-0.22 -0.22 -0.22]
更新后的权值: [-0.07282076 0.01324004 0.57238846]
样本: [1 0 2], 标签: -1, 预测: 1
权值更新量(eta * (Y[i] - y_pred) * X[i]): [-0.22 -0. -0.44]
更新后的权值: [-0.29282076 0.01324004 0.13238846]
=== 第 4 轮迭代 ===
训练在第 4 轮收敛
训练后的权值: [-0.29282076 0.01324004 0.13238846]
import numpy as np
# 数据
X = np.array([
[1, 3, 3],
[1, 4, 3],
[1, 1, 1],
[1, 0, 2]
])
Y = np.array([1, 1, -1, -1])
# 初始化权值和参数
W = np.random.uniform(-1, 1, 3) # 权值初始化
eta = 0.11 # 学习率
max_epochs = 100 # 最大迭代次数
# 激活函数
def sign(x):
return 1 if x > 0 else -1
# 训练
print("初始权值:", W)
for epoch in range(max_epochs):
print(f"\n=== 第 {epoch + 1} 轮迭代 ===")
errors = 0
for i in range(len(X)):
# 前向传播
y_pred = sign(np.dot(X[i], W))
# 检查预测是否正确
if y_pred != Y[i]:
errors += 1
delta_W = eta * (Y[i] - y_pred) * X[i] # 计算权值更新量
W += delta_W # 更新权值
# 打印更新信息
print(f"样本: {X[i]}, 标签: {Y[i]}, 预测: {y_pred}")
print(f"权值更新量(eta * (Y[i] - y_pred) * X[i]): {delta_W}")
print(f"更新后的权值: {W}")
if errors == 0: # 如果没有错误分类
print(f"训练在第 {epoch + 1} 轮收敛")
break
else:
print("未在最大迭代次数内收敛")
print("\n训练后的权值:", W)