统计学习-感知机算法

简介: 感知机(perceptron):有监督学习、判别模型,SVM的基础

解决问题:二分类、线性分类(不能解决异或问题)

感知机(perceptron):有监督学习、判别模型,SVM的基础

模型:

输入:

22ec5450db14fbe8d3791bb224110f14_20190914184333817.png

输出:

4a56572cd778530205161468118634bc_20190914184350849.png

64f24ff999462729df70c7d0307525ea_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlZGEz,size_16,color_FFFFFF,t_70.png

模型 参数为w和b

策略:

数据集满足线性可分性

学习一个能将正类和负类完全正确分开的分离超平面

1)依据误分类的点数(不是参数wb的连续可导函数,不易优化)

2)误分类点到超平面S的总距离

任意一点到超平面的距离:

ffadb756312c3f7fc870b68d950630c9_20190914184741884.png

(推导)替换为:

8c1870ba9916f9505863b8819ccc3221_2019091418483921.png

因此所有误分类点到超平面距离的和:

50d59d9a67411ccc672ae15382ccfc1d_20190914184848755.png

得出感知机学习的损失函数为:

053afcf5b0cd18bead70044a169d0451_20190914184940903.png

学习算法:

随机梯度下降

1)

3889313d1ef11f85c942a2925072df2d_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlZGEz,size_16,color_FFFFFF,t_70.png

2)对偶形式的区别是,引入了更新次数n

学习到的w和b有区别:

8c67cbb2b86760f38b237c098798e421_20190914185455345.png

dbe42bdc8f440ffdc35d75eda302ecfe_20190914185546500.png

fb92248ccde195249a7e0e241c8291ef_20190914185635236.png

其中的yjxj已知,可以提前计算得出:Gram矩阵

简单形式代码:

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=np.array([[0], [6]])#嵌套列表和不嵌套的区别 ,这个嵌套表示2*1
    y_predict=(-b-(w[0]*X_new))/w[1]#W0x+w1y+b=0 则y=-b/w1-w0*x/w1
    #绘制训练数据集的散点图
    plt.plot(X[:2,0],X[:2,1],"g*",label="1")
    plt.plot(X[2:,0], X[2:,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,3],[4,3],[1,1],[2,2]])
    y_train=np.array([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()

Sklearn实现:

from sklearn.linear_model import Perceptron
import numpy as np
X_train = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])
#perceptron=Perceptron()
perceptron=Perceptron(penalty="l2",alpha=0.01,eta0=1,tol=1e-3)
perceptron.fit(X_train,y)
print("w:",perceptron.coef_,"\n","b:",perceptron.intercept_,"\n","n_iter:",perceptron.n_iter_)
res=perceptron.score(X_train,y)
print("correct rate:{:.0%}".format(res))
X=X_train
X_new=np.array([[0], [6]])
w=perceptron.coef_
w=w.T
b=perceptron.intercept_
y_predict=(-b-(w[0]*X_new))/w[1]#W0x+w1y+b=0 则y=-b/w1-w0*x/w1
plt.plot(X[:2,0],X[:2,1],"g*",label="1")
plt.plot(X[2:,0], X[2:,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()
X1=np.array([[2,2]])
y2=perceptron.predict(X1)

函数:

f47ae8e6ec2af5caf03e6bf56945668c_20190914191101501.png返回属性值

3ab123bfc734a0f81665ea38b56b593f_20190914191018517.png

664a8598a6dcd43793aec1bab4ebcd23_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlZGEz,size_16,color_FFFFFF,t_70.png

补充:

1)为什么不能解决异或问题?

 比如 00  (1) 11(1) 01(0) 10(0) 在坐标系中表示点,无法用一条直线将它们不同的类别完全划分开

参考资料

【1】统计机器学习

【2】中文文档https://sklearn.apachecn.org/

【3】https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.Perceptron.html


目录
相关文章
|
5月前
|
机器学习/深度学习 算法 BI
机器学习笔记(一) 感知机算法 之 原理篇
机器学习笔记(一) 感知机算法 之 原理篇
|
机器学习/深度学习 算法 Python
使用 Python 探索 感知机 算法
使用 Python 探索 感知机 算法
58 0
|
机器学习/深度学习 人工智能 算法
【机器学习】线性分类——感知机算法(理论+图解+公式推导)
【机器学习】线性分类——感知机算法(理论+图解+公式推导)
320 0
【机器学习】线性分类——感知机算法(理论+图解+公式推导)
|
算法
统计学习-朴素贝叶斯算法(Naive Bayes)
监督学习模型,属于生成模型,非线性
105 0
统计学习-朴素贝叶斯算法(Naive Bayes)
|
机器学习/深度学习 算法
《统计学习方法》极简笔记P6:逻辑回归算法推导
《统计学习方法》极简笔记P6:逻辑回归算法推导
《统计学习方法》极简笔记P6:逻辑回归算法推导
|
算法 异构计算 Python
|
机器学习/深度学习 资源调度 算法
机器学习:感知机算法
机器学习:感知机算法
132 0
 机器学习:感知机算法
梯度下降算法过程以及感知机算法与梯度下降算法区别
梯度下降算法过程以及感知机算法与梯度下降算法区别
DL之Perceptron&AdalineGD:基于iris莺尾花数据集利用Perceptron感知机和AdalineGD算法实现二分类
DL之Perceptron&AdalineGD:基于iris莺尾花数据集利用Perceptron感知机和AdalineGD算法实现二分类
DL之Perceptron&AdalineGD:基于iris莺尾花数据集利用Perceptron感知机和AdalineGD算法实现二分类
|
机器学习/深度学习 算法
通俗解释优化的线性感知机算法:Pocket PLA
通俗解释优化的线性感知机算法:Pocket PLA
342 0
通俗解释优化的线性感知机算法:Pocket PLA