第二章 感知机(perceptron)

感知机是一个二分类的线性分类模型。用线性模型X.W+b=0 展开来就是 x^{(1)}*w^{(1)}+x^{(2)}*w^{(2)}+......x^{(n)}*w^{(n)}+b=0
也就是X,W 内积 [x,w]+b =0
用线性模型来作为分割超平面。来划分类别。
其本质还是优化问题。就是各个误分类样本点到分离超平面的距离和的最小值问题

image.png
image.png

感知机的自编程实现

import numpy as np
import matplotlib.pyplot as plt

class MyPerceptron:
    def __init__(self):
        self.w=None
        self.b=0
        self.l_rate=1

    def fit(self,X_train,y_train):
        #用样本点的特征数更新初始w,如x1=(3,3)T,有两个特征,则self.w=[0,0]
        self.w=np.zeros(X_train.shape[1])
        i=0
        while i<X_train.shape[0]:
            X=X_train[i]
            y=y_train[i]
            # 如果y*(wx+b)≤0 说明是误判点,更新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=range(6)
    y_predict=-(b/w[1])-((w[0]*X_new)/w[1])
    #绘制训练数据集的散点图
    plt.plot(X[:3,0],X[:3,1],"g*",label="1")
    plt.plot(X[3:,0], X[3:,1], "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,2.5],[3,3],[4,3],[1,1],[1,1.5]])
    y_train=np.array([1,1,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()

image.png

梯度下降,求损失函数的最小值的一种方法
梯度 梯度的定义 各个维度的偏导向量,和各个维度的自然基的内积
超参数是模型之外,无法从训练数据中得到的,调节效率,模型结构等的旋钮

image.png

有关梯度以及梯度下降优化算法,
<https://www.cnblogs.com/wangguchangqing/p/10521330.html>

感知机模型收敛性推导novikeff 不等式


image.png
image.png
image.png

感知机的对偶形式
知乎 感知机对偶形式理解

觉得对偶形式难懂的点在于ni而ni的含义书上并没有明说,查了好久才发现。

ni表示的是第i个样本点被误判的次数,而感知机一般形式中的w其实就是每个样本点被误判的次数乘以 XiYi的累加和,也就

image.png

在每次迭代的时候,ni表示的是到当前为止,第i个样本点被误判的次数,这个很重要。

因为要反复让样本点中的输入x两两相乘(这个在一般形式中计算w的时候也要这样,自己模拟一遍就发现了),所以提前搞成一个矩阵存起来,类似于平时刷算法题说的打表。。。所以两个形式本质上是一样的,不过把w用另外一种形式表示。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容