感知机自编程与sklearn实现
感知机模型
对于下面题目,分别用自编程和 sklearn 库实现。
已知训练数据集D,其正实例点是x1=(3,3)T,x2=(4,3)T,负实例点是x3=(1,1)T:
(1) 用python 自编程实现感知机模型,对训练数据集进行分类,并对比误分类点选择次序不同对最终结果的影响。可采用函数式编程或面向对象的编程。
(2)试调用sklearn.linear_model 的Perceptron模块,对训练数据集进行分类,并对比不同学习率h对模型学习速度及结果的影响。
自编程
参考preceptron.py
import numpy as np
import matplotlib.pyplot as plt
class MyPerceptron:
def __init__(self):
# 初始化w b为0,w是向量,所以是None
self.w = None
self.b = 0
self.l_rate = 1
def fit(self, X_train, y_train):
# 用样本点的特征数更新初始w
self.w = np.zeros(X_train.shape[1])
i = 0
# 样本点从下标0开始
while i < X_train.shape[0]:
X = X_train[i]
y = y_train[i]
# 如果y*(wx+b)<=0,样本i为误判点,更新w,b
if y * (np.dot(self.w, X) + self.b) <= 0:
self.w = self.w + self.l_rate * np.dot(y, X)
self.b = self.b + self.l_rate * y
i = 0 # 因为是误判点,所以从新开始
else:
i += 1
def draw(X, w, b):
# 生产分离超平面上的两点
X_new = np.array([[0], [6]])
y_predict = -b - (w[0] * X_new) / w[1]
# 绘制训练集数据的散点图
plt.plot(X[:2, 0], X[:2, 1], "g*", label="1")
plt.plot(X[2:, 0], X[2:, 0], "rx", label="-1")
# 绘制分离超平面
plt.plot(X_new, y_predict, "b-")
# 设置两坐标轴起止值
plt.axis([0, 6, 0, 6])
plt.xlabel("x1")
plt.ylabel("x2")
# 显示图例
plt.legend()
# 显示图像
plt.show()
def main():
# 构造训练数据集
X_train = np.array([[3, 3], [4, 3], [1, 1]])
y_train = np.array([1, 1, -1])
# 构建感知机对象,对数据集进行训练
perceptron = MyPerceptron()
perceptron.fit(X_train, y_train)
print(perceptron.w)
print(perceptron.b)
# 结果图像绘制
draw(X_train, perceptron.w, perceptron.b)
if __name__ == "__main__":
main()
sklearn调参
参考skl_preceptron.py
# -*- coding: utf-8 -*-
from sklearn.linear_model import Perceptron
import numpy as np
# 构造训练数据集
X_train = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])
perceptron = Perceptron()
# perceptron=Perceptron(penalty="l2",alpha=0.01,eta0=1,max_iter=50,tol=1e-3)
perceptron.fit(X_train, y)
# 查看训练后感知机的各个参数
print(
"w:", perceptron.coef_, "\n", "b:", perceptron.intercept_,
)
res = perceptron.score(X_train, y)
print("correct rate:{:.0%}".format(res))
属性-变量
属性 | 含义 |
---|---|
coef_(权重) | 对应w |
intercept_ | 对应b |
n_iter_ | 迭代次数 |
方法-函数
方法 | 用处 |
---|---|
fit | 用于训练数据集 |
score | 用来评价训练效果 |
模型训练参数
参数 | 默认值 | 可选值 |
---|---|---|
penalty(正则化项) | None | 'l1'or'l2'or'elasticnet' |
alpha(正则化系数) | 0.0001 | |
eta0(学习率) | 1 | (0,1] |
max_iter(迭代次数) | 5 | 如果tol不为None则为1000 |
tol(终止条件) | None | (previous_loss)<tol |
Q1:学习率对迭代过程和最终结果有无影响?
Q2:无影响的条件是什么?
A:无影响,条件是 W、b 的初始值均为 0 。当二者初始值为 0 时,二者值的更新都是学习率的倍数。
Q3:L1 L2 分别有什么作用?
A: L1 使特征值更稀疏,L2 使 权值更均匀。
Q4:正则化洗漱对正则化有何影响?
A: 过小无约束效力,过大则约束的太狠。
GitHub地址:https://github.com/protea-ban/LiHang_Statistical_Learning_Methods