[Python-代码实现]统计学习方法之感知机模型

内容简介

  1. 感知机模型 - 手写 Coding
  2. 使用手写模型进行鸢尾花分类
  3. 使用 sklearn 中的感知机进行鸢尾花分类

感知机模型 - 手写 Coding

class Model:
"""感知机模型"""
    def __init__(self, data):
        """选取初值 w, b, η"""
        self.w = np.zeros(len(data[0]) - 1, dtype=np.float32)  # 参数 w 应与 x 等量
        self.b = 0
        self.η = 0.1

    def sign(self, x):
        """感知机模型"""
        y = np.dot(self.w, x) + self.b
        return 1 if y >= 0 else -1

    def fit(self, x_train, y_train):
        """模型训练"""
        while True:
            for d, x in enumerate(x_train):  # 取出一条数据
                y = y_train[d]  # 取出对应数据的 target
                if y * self.sign(x) <= 0:  # 分类不正确进行参数更迭
                    self.w = self.w + np.dot(self.η * y, x)
                    self.b = self.b + self.η * y
                    break  # 发生更迭即存在分类错误,从头再来
            else:  # 没有发生更迭即全部分类正确,停止训练
                break

        return self.w, self.b

使用手写模型进行鸢尾花分类

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt


def main():
    # 一、加载数据
    iris = load_iris()

    # 二、提取输入与输出数据
    # 为输入特征创建 Frame,并使用特征名称作为列标题(注意不是列索引)
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    # 添加输出列 target
    df['target'] = iris.target
    # 给 Frame 添加列索引(只有加了索引才可以使用索引)
    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'target']
    # 打印输出值分布情况
    print(df.target.value_counts())

    # 三、绘出数据并观察分布情况
    # 通过 frame 能够看出数据是 50 间隔分布,因此可以以 50 间隔分别取出
    plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
    plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
    plt.xlabel('sepal length')
    plt.ylabel('sepal width')
    plt.legend()
    plt.show()

    # 四、特征提取与目标值提取
    # 使用 iloc 选取前 100 条数据的第 0, 1, -1 列,并转换为 array
    data = np.array(df.iloc[:100, [0, 1, -1]])
    # 将 第 0, 1 列数据赋值给 x,将 第 -1 列数据赋值给 y
    x_train, y_train = data[:, :-1], data[:, -1]
    # 将 y 值进行 1, -1分类
    y_train = np.array([i if i == 1 else -1 for i in y_train])

    # 五、感知机模型训练
    perceptron = Model(data)
    w, b = perceptron.fit(x_train, y_train)

    # 六、绘出判定边界
    # 分离超平面为 w[0]x_1 + w[1]x_2 + b = 0
    x_1 = np.linspace(4, 7, 10)
    x_2 = -(w[0] * x_1 + b) / w[1]
    plt.plot(x_1, x_2)
    plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
    plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
    plt.xlabel('sepal length')
    plt.ylabel('sepal width')
    plt.legend()
    plt.show()


if __name__ == '__main__':
    main()

使用 sklearn 中的感知机进行鸢尾花分类

import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn.linear_model import Perceptron
import matplotlib.pyplot as plt


def main():
    # 一、加载数据
    iris = load_iris()

    # 二、提取输入与输出数据
    # 为输入特征创建 Frame,并使用特征名称作为列标题(注意不是列索引)
    df = pd.DataFrame(iris.data, columns=iris.feature_names)
    # 添加输出列 target
    df['target'] = iris.target
    # 给 Frame 添加列索引(只有加了索引才可以使用索引)
    df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'target']

    # 三、特征提取与目标值提取
    # 使用 iloc 选取前 100 条数据的第 0, 1, -1 列,并转换为 array
    data = np.array(df.iloc[:100, [0, 1, -1]])
    # 将 第 0, 1 列数据赋值给 x,将 第 -1 列数据赋值给 y
    x_train, y_train = data[:, :-1], data[:, -1]
    # 将 y 值进行 1, -1分类
    y_train = np.array([i if i == 1 else -1 for i in y_train])

    # 四、使用SKlearn感知机进行模型训练
    clf = Perceptron()
    clf.fit(x_train, y_train)
    w = clf.coef_[0]  # w
    b = clf.intercept_  # b

    # 五、绘出判定边界
    # 分离超平面为 w[0]x_1 + w[1]x_2 + b = 0
    x_1 = np.linspace(4, 7, 10)
    x_2 = -(w[0] * x_1 + b) / w[1]
    plt.plot(x_1, x_2)
    plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')
    plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')
    plt.xlabel('sepal length')
    plt.ylabel('sepal width')
    plt.legend()
    plt.show()


if __name__ == '__main__':
    main()

希望对你有所帮助,点个赞哇大兄dei!
个人博客:http://xingtu.info
GitHub:https://github.com/BreezeDawn/MachineLearning

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡泡码客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值