统计学习方法感知机算法Python实现

import numpy as np
import matplotlib.pyplot as plt


class MyPerception:
    def __init__(self):
        """
        完成对于权值,偏置和学习率的初始化
        """
        self.w = None # 权值
        self.b = 0 # 偏置
        self.l_rate = 1 # 学习率

    def fit(self, X_train, y_train):
        """
        该函数完成对于感知机算法的实现
        :param X_train:
        :param y_train:
        :return:
        """
        self.w = np.zeros(X_train.shape[1]) # shape[0]获得变量的特征数,调用zeros生成零向量赋值给w
        i = 0
        while i < X_train.shape[0]: # shape[0]代表数据的个数
            x = X_train[i] # 获取数据i的值
            y = y_train[i] # 获取数据i所对应的标签为正例还是负例

            # 判断是否分类错误,如果分类错误则进行调整,dot()返回的是两个数组的点积,如果是一维数组,则得到的是两个数组的内积
            if y*(np.dot(self.w, x) + self.b) <= 0:

                # 对误分类点进行更新
                self.w += self.l_rate * np.dot(y, x)
                self.b += self.l_rate * y
                draw(X_train, self.w, self.b)
                i = 0 # 由于每次更新都需要重新进行点进行判断是否误分类,因此将i置为0
            else:
                i += 1


def draw(X, w, b):
    """
    该函数完成图像的绘制
    :param X:
    :param w:
    :param b:
    :return:
    """
    X_new = np.array([[0],[6]])
    y_new = -b - (w[0] * X_new) / w[1]
    print(X_new)
    print(y_new)
    plt.plot(X[:2,0], X[:2,1], "b*", label="A")
    plt.plot(X[2:,0], X[2:,1], "r*", label="B")
    plt.plot(X_new, y_new, "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],[1,2],[4,5],[1,6],[4,2]]) # 三个数据点
    y_train = np.array([1,1,-1,-1,1,-1,1]) # 各个数据点所对应的标签,是正例还是负例
    perception = MyPerception() # 创建MyPerciption对象
    perception.fit(X_train, y_train) # 感知机算法调用
    print(perception.w)
    print(perception.b)
    draw(X_train, perception.w, perception.b)

if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值