感知机自编程与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

posted @ 2020-04-22 10:00  banshaohuan  阅读(702)  评论(0编辑  收藏  举报