zoukankan      html  css  js  c++  java
  • 感知机自编程与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_, "
    ", "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

  • 相关阅读:
    C#动态编译计算表达式的值 拓荒者
    Microsoft AJAX Library对 Error的扩展 拓荒者
    在分布式事务(MSDTC)中使用OLE DB数据库连接访问数据 拓荒者
    【转】ExtJS DateField 日期控件Format格式化 拓荒者
    自定义 Web 服务器控件 拓荒者
    Microsoft AJAX Library对 Array的扩展 拓荒者
    (转载)IE 浏览器的创新
    XUnit配置Resharper快捷键
    表现层模式MVC
    读Clean Code 数据结构和对象
  • 原文地址:https://www.cnblogs.com/banshaohuan/p/12750093.html
Copyright © 2011-2022 走看看