学习资源:https://www.bilibili.com/video/BV1NJ41177Ec?p=3
图片加载不出来看这:
Auspic
感知机学习规则:
对于感知机的学习规则总的来说可以用下面的这一张图来概括:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o5oODQ2q-1599794323207)(https://s1.ax1x.com/2020/09/11/wtSJCd.png)]
先简单的介绍一下感知机的学习规则,这是一个监督式的学习,就是在传入数据中给出答案,感知机自己判断数据,而在判断结果与答案
不同时,自动的通过修正系数的方式进行机器学习,w代表的是进行每次感知机训练传入数据的分别的系数,默认的这些系数是按照一个
数的附近进行正态分布的,而在下面的对传入数据的判断,比如在感知机的训练实例中的根据这些系数进行对数据的进行两种花种类的判
断,那么在我们的感知机的训练中如果判断结果与答案是有出入或者出错的,那么就会自动修改这些系数来进行机器学习。
那么我们是如何通过这些系数和传入的数据对花的种类进行判断的呢?
我们首先定义一个z = w0**1 + w1x1 + w2x2… 为两个向量相乘w[]点乘x[],w为系数,x为样本数据
比如就是说在训练的实例中我们就是通过传入花萼长度和花瓣宽度来得出z,z如果是大于0的那么取为1那么这个数据就是抽象化为1的花,z如果是小于0的那么取-1那么这个数据就是抽抽象化为-1的花。
即z = z>=0?1:-1
其实要注意到的是z的式子中w0*1其实是对z进行判断的时候用来分界的数字z = z<=w0?:1:-1,但是我们并不知道这个参数是什么,那么这时将这个参数放入z的式子中直接将z = z>=0?1:-1那么这时候我们就在感知机训练数据的时候同时对w0进行修正,w0的初始值按照正态分布取值。
那么如何对错误数据反馈给感知机,进而对这些系数进行修正?
我们的感知机对一段花进行分类错误的时候,对全部的系数进行修正的方式是遵循一个公式:
eta是我们创建对象的时候设置的学习速率,predict(xi)为根据数据对花进行分类,taeget为答案
即 w += yn(t)*xi
update = self.eta * (target - self.predict(xi))
self.w_[1:] += update * xi#update若不是零的话自然会更新w_数组
即对这两个向量wi与xi进行加法运算:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CKiIG2gK-1599794323214)(https://s1.ax1x.com/2020/09/11/wtF3Uf.png)]
但是我们可以看到,我们对这些点进行区分,我们在直观的在图上描绘可以看出,这些点都是线性可分的,也就是都是可以用一条直线进行区分的,这个感知机只是一个非常初级的感知机只能对线性可分的数据进行区分,还有更复杂的感知机学习规则需要去学习。
感知机训练实例:
感知机class:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
class Perceptron(object):
"""Perceptron classifier.
Parameters
------------
eta : float
Learning rate (between 0.0 and 1.0)
n_iter : int
Passes over the training dataset.
random_state : int
Random number generator seed for random weight
initialization.
Attributes
-----------
w_ : 1d-array
Weights after fitting.
errors_ : list
Number of misclassifications (updates) in each epoch.
"""
#默认学习速度为0.1,训练次数为50次
def __init__