感知机原始形式的题目:
输入数据为正例点x1=(3,3)T,x2=(4,3)T,负例点x3=(1,1)T,用感知机学习算法的原始形式求感知机模型 f(x)=sign(wx+b),其中w=(w1,w2)T,x=(x1,x2)T
代码实现如下:
# 统计学习方法(李航)第二版——第2章 感知机 课本例题2.1 实现代码
# data:2022/10/14
import numpy as np
# 定义数据集 x_data 按列输入 y_data中按行做输出
x_data = np.array([[3, 4, 1],
[3, 3, 1]])
y_data = np.array([[1], [1], [-1]])
# 初始化超平面
# 一定要注意w和b的维度问题
w = np.array([[0], [0]]) # 维度是2,因为一个x数据为维的
b = 0 # 维度为1,因为输出y是一维的
lr = 1 # 步长
# 梯度下降法极小化目标函数
total_spisode = 50
episode = 0
while episode < total_spisode:
loss = 0
episode += 1
for i in range(3):
x = x_data[:, i] # 这样之后x是(2,)
x = np.expand_dims(x, axis=1) # x变为(1,2)
y = y_data[i, :]
if y * (np.sum(x * w) + b) > 0:
continue
else:
loss += - y * (np.sum(x * w) + b)
# 这里也得注意向量乘积的维度问题
w = w + lr * x * y
b = b + lr * y
print("x{}: w: {}, b: {}".format(i, w, b))
print("Episode: {}, loss: {}".format(episode, loss))
if loss == 0:
break
print("End: w = {}, b={}".format(w, b))