参考书籍: 邓立国等《python深度学习原理、算法与案例》清华大学出版社
3.3 感知机
3.3.1 感知机模型
感知机,又称阈值逻辑单元(Threshold Logic Unit,TLU)/线性阈值单元(Linear Threshold Unit,LTU)
经典数据集:Iris Data Set(鸢尾属植物数据集)
但是这个数据集有些复杂,没什么必要用,自己写了个简单的数据集。
import numpy as np
from sklearn.linear_model import Perceptron
# 每个数据单元由两个数据项组成
data = np.array([
[0, 0],
[0, 1],
[1, 0],
[1, 1]
])
# 标签就是给数据分类的
# 此标签表示第一个数据为第一类,后面的三个数据为第二类
tag = np.array([0, 1, 1, 1])
# Perceptron 是 sklearn.linear_model 模块中的一个类,用于实现感知机算法。这个类的构造函数接受几个参数:
# max_iter=1000:这是最大迭代次数,即算法寻找最优解的最大尝试次数。
# tol=1e-3:这是停止标准的公差,如果模型在连续两次迭代中的改进小于这个值,那么就会停止迭代。
# random_state=42:这是随机数生成器的种子,用于初始化模型的权重。通过设置随机种子,可以确保每次运行代码时得到相同的结果。
per_clf = Perceptron(max_iter=1000, tol=1e-3, random_state=42)
# 用数据data和对应的标签tag来训练感知机
per_clf.fit(data, tag)
print(f"w = {per_clf.coef_}")
print(f"b = {per_clf.intercept_}")
输出:
w = [[2. 2.]]
b = [-1.]
感知机的模型预测公式 \(y = w^Tx + b\) ,从上面的结果看,将 \(w = [2, 2]^T\) 和 \(b=-1\) 代入模型公式后,当x = [0, 0]时,y = -1 < 0,是为负类,而其他点代入之后,y都大于1,是为正类。(感知机模型默认的阶跃函数是:
\[f(z) = \left\{ \begin{array}{l} 1, z > 0 \\ 0, 其他 \end{array} \right. \]所以大于0是正类,小于0是负类。)
训练完模型之后,就可以用Perception的预测方法.predict来预测新数据点的类型是什么了。
data_for_preditc = [[2,2], [0, 0.4]]
prediction = per_clf.predict(data_for_preditc) # predict接收二维数组作为参数
print(f"新数据点{data_for_preditc}的类别是:{prediction}")
输出:
新数据点[[2, 2], [0, 0.4]]的类别是:[1 0]
其实感知机就是个线性回归加个阈值