zoukankan      html  css  js  c++  java
  • 感知机原理及代码实现小结

    感知机是线性分类模型,其输入是一个实例特征向量,输出是该实例的类别,取+1和-1。而感知机是输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习的目标就是求出将训练数据进行线性划分的分离超平面,导入基于误分类的损失函数,利用梯度下降法对损失函数极小化,求得感知机模型。有一点,要注意:使用感知机的前提是训练数据线性可分。

    1 感知机的模型

    感知机模型
    假设训练数据集(T=left { left ( x_{1},y_{1} ight ),left ( x_{2},y_{2} ight ),cdots ,left ( x_{m},y_{m} ight ) ight }),其中,每个样本有(n)个特征,输出二元类别(left { +1,-1 ight }),感知机的目的是在特征空间中找到一个超平面(S)( heta _{0}+ heta _{1}x_{1}+cdots+ heta _{n}x_{n}=0),将特征空间划分成两个部分,位于两部分的点分别被分为正类和负类。由于使用感知机的前提是数据线性可分,因此超平面(S)不是唯一的,感知机模型有多个解。令(x_{0}=1),超平面(S)表达式为:

    [sum_{i=0}^{n} heta _{i}x_{i}=0 ]

    其向量表示为:( heta ^{T}cdot x=0),其中( heta)(x)均为((n+1) imes 1)的列向量。
    感知机模型的表达式:(y=sign( heta ^{T}cdot x))
    其中,

    [sign(x)=left{egin{matrix} +1, xgeq 0 & \ -1, x< 0& end{matrix} ight.]

    感知机损失函数
    输入空间中任一点(x_{0})到超平面(S)的距离表达式为:$$frac{| heta ^{T}cdot x^{(i)}|}{|| heta ||{2}}$$
    对于误分类的数据(left ( x_{i},y_{i} ight )),$$-y
    {i}( heta ^{T}cdot x)> 0$$
    因为当( heta ^{T}cdot x> 0)时,(y_{i}=-1),而当( heta ^{T}cdot x< 0)时,(y_{i}=+1)。所以,误分类点(x_{i})到超平面(S)的距离表达式为:$$-frac{y_{i}( heta ^{T}cdot x^{(i)})}{|| heta ||{2}}$$
    假设超平面(S)的误分类点集合为(M),所有误分类点到超平面(S)的总距离表达式为: $$-frac{1}{|| heta||
    {2}}sum_{x_{i}epsilon M}y_{i}( heta ^{T}cdot x^{(i)})$$
    不考虑(frac{1}{|| heta||_{2}}),则得到感知机损失函数表达式为:$$J( heta )=-sum_{x_{i}epsilon M}y_{i}( heta ^{T}cdot x^{(i)})$$
    由损失函数看出,损失函数是非负的,没有误分类点时,损失函数值为0,当误分类点越少,误分类点离超平面越近,损失函数值就越小。

    2 感知机算法

    感知机算法

    输入: 线性可分数据集(T=left { (x_{1},y_{1}),(x_{2},y_{2}),cdots ,(x_{m},y_{m}) ight }),每个样本是(n)维特征,(y_{i}epsilon left { -1,+1 ight }),学习率(alpha)((0< alpha leq 1));

    输出: 感知机模型参数 $ heta $向量;

    step1 初始化$ heta (和)alpha$

    step2 数据集中选择一个误分类点((x_{i},y_{i})),这里(x_{i})(n)维向量,如果该点满足(y_{i}( heta ^{T}cdot x_{i})leq 0)

    step3 对感知机模型参数 $ heta $向量进行一次随机梯度下降迭代: ( heta := heta +alpha y_{i}x_{i})

    step4 直到数据集中不存在误分类点,否则跳转至步骤2

    3 感知机代码实现

    from sklearn.datasets import make_classification
    x,y = make_classification(n_samples=1000, n_features=2, n_redundant=0, n_informative=1, n_clusters_per_class=1)
    
    
    #训练数据和测试数据
    x_data_train = x[:800,:]
    x_data_test = x[800:,:]
    y_data_train = y[:800]
    y_data_test = y[800:]
    
    #正例和反例
    positive_x1 = [x[i,0] for i in range(1000) if y[i] == 1]
    positive_x2 = [x[i,1] for i in range(1000) if y[i] == 1]
    negetive_x1 = [x[i,0] for i in range(1000) if y[i] == 0]
    negetive_x2 = [x[i,1] for i in range(1000) if y[i] == 0]
    
    #定义一个感知机
    from sklearn.linear_model import Perceptron
    clf = Perceptron(fit_intercept=False, n_iter=30, shuffle=False)
    clf.fit(x_data_train, y_data_train)
    print(clf.coef_)
    #输出
    [[-0.33706658  3.30497893]]
    print(clf.intercept_)
    #输出
    [ 0.]
    
    acc = clf.score(x_data_test,y_data_test)
    print(acc)  #0.985
    
    #可视化感知机结果
    
    import numpy as np
    from matplotlib import pyplot as plt
    #画出正例和反例的散点图
    plt.scatter(positive_x1,positive_x2,c='red')
    plt.scatter(negetive_x1,negetive_x2,c='blue')
    #画出超平面(在本例中即是一条直线)
    line_x = np.arange(-4,4)
    line_y = line_x * (-clf.coef_[0][0] / clf.coef_[0][1]) - clf.intercept_
    plt.plot(line_x,line_y)
    plt.show()             
    

    感知机小结

  • 相关阅读:
    CodeForces979D:Kuro and GCD and XOR and SUM(Trie树&指针&Xor)
    HDU4188:RealPhobia (连分数的运用之一)
    从HDU2588:GCD 到 HDU5514:Frogs (欧拉公式)
    SPOJ:Eagle and Dogs(求树上每个点最远可以走到哪里---树的直径||DP)
    【字符串】BZOJ上面几个AC自动机求最为字串出现次数的题目
    codeforces round #405 B. Bear and Friendship Condition
    codeforces round #419 C. Karen and Game
    codeforces round #419 B. Karen and Coffee
    codeforces round #419 A. Karen and Morning
    【ZOJ 3609】Modular Inverse 最小乘法逆元
  • 原文地址:https://www.cnblogs.com/eugene0/p/11440818.html
Copyright © 2011-2022 走看看