机器学习 - 感知机

本文介绍了感知机模型的基本概念,包括其定义、几何解释及学习策略。详细解析了感知机的学习算法,并提供了Python实现代码。
部署运行你感兴趣的模型镜像

博客内容源于《统计机器学习》一书的阅读笔记。Python的源码实现源于《机器学习实战》部分内容。

1. 感知机模型

感知机是二分类的线性分类模型,该模型的输入为实例的特征向量,输出为实例的类别,一般取+1和-1两个值。感知机将实例划分为两类,属于判别模型。

1.1 模型定义

【感知机定义】
假设输入空间(特征空间)是XRn,输出空间是Y={1,+1}

  • 输入xX 表示实例的特征向量对应于输入空间(特征空间)的点。
  • 输出yY 表示实例的类别。

从输入空间到输出空间有如下的变换关系:

f(x)=sign(wx+b)(1)

上述的变换关系就称为感知机。其中,wb 称为感知机模型参数,wRn 叫做权值或者权值向量, bR 叫做偏置。

1.2 模型的几何解释

线性方程:

wx+b=0

对应于特征空间Rn 中的一个超平面S,其中w 是超平面的法向量,b 是超平面的截距。这个超平面将特征空间划分成了两个部分,位于两部分的点(特征向量)分别被分为正负两类,因此,超平面S 称为分离超平面。

感知机

2. 感知机学习策略

假设训练数据集都是线性可分的,感知机学习的目标就是求得一个能够将训练数据集正实例点和负实例点完全正确分开的超平面。为了找到这个超平面,需要确定一个学习策略。定义一个损失函数,转化为求损失函数的极小值。
1. 很容易想到的是:将损失函数定义为误分点的个数,但是这里会有一个问题,因为这样的函数不是连续函数,所以对于参数w,b 来说都是不可导的函数,这样不容易对问题进行优化。
2. 损失函数定义为误分类点到超平面S 的总距离,这个损失函数是感知机所采用的。可知,x0Rn x0 表示输入空间中的任何一点,该点到超平面S 的距离:

|wx0+b|w

对于误分类的数据(xi,yi)来说,

yi(wxi+b)>0

所以可以所有将误分类点点超平面的总距离定义为:
1wxiMyi(wxi+b)

上式中,若不考虑 1w , 那么就得到了感知机学习的损失函数。
L(w,b)=xiMyi(wxi+b)()

上式中M 表示误分点的集合,这个损失函数就是感知机学习的经验风险函数。

3. 感知机学习算法

有了上面的损失函数,问题就转化成了一个优化问题,也就是求解损失函数的最小值。

3.1 感知机学习算法原始形式

【问题】
给定一个训练数据集

T={(x1,y1),(x1,y1),,(xN,yN)}

其中,xiX=Rn,yiY=1,+1,i=1,2,,N,求参数wb,使得损失函数的值为最小:
minw,bL(w,b)=minw,b[xiMyi(wxi+b)]

其中,M 表示误分点的集合。损失函数L(w,b) 的梯度:
wL(w,b)=xiMyixibL(w,b)=xiMyi

采用梯度下降法就可以求解上述的问题,具体的求解步骤如下:
1. 任意选取一个超平面w0,b0
2. 在训练数据集中选取数据(xi,yi)
3. 如果yi(wxi+b)0

ww+ηyixibb+ηyi

4.继续第2步,直到训练集中没有误分点(线性可分情况)。

3.2 Python实现感知机


原题

import numpy as np
import matplotlib.pyplot as plt

class showPicture:
    def __init__(self,data,tag,w,b):
        self.b = b
        self.w = w
        plt.figure(1)
        plt.title('Pic', size=14)
        plt.xlabel('x', size=14)
        plt.ylabel('y', size=14)

        xData = np.linspace(0, 5, 100)
        yData = self.expression(xData)
        plt.plot(xData, yData, color='r', label='y1 data')
        for i in range(len(data)):
            if tag[i] == 1:
                plt.scatter(data[i][0],data[i][1],s=50)
            else:
                plt.scatter(data[i][0],data[i][1],marker='x',s=50)
        plt.savefig('pic.png',dpi=75)

    def expression(self,x):
        y = (-self.b - self.w[0]*x)/self.w[1]
        return y

    def show(self):
        plt.show()

class perceptron:
    def __init__(self,x,y,eta=1):
        self.x = x
        self.y = y
        self.w = np.zeros((x.shape[1],1))
        self.b = 0
        self.eta = eta

    def sign(self,w,b,x):
        y = np.dot(x,w)+b
        return int(y)

    def train(self):
        flag = True
        length = len(self.x)
        while flag:
            count = 0
            for i in range(length):
                #print self.x[i,:]
                tmpY = self.sign(self.w,self.b,self.x[i,:])
                if tmpY*self.y[i]<=0:
                    tmp = self.y[i] * self.eta * self.x[i,:]
                    tmp = tmp.reshape(self.w.shape)
                    self.w = self.w + tmp
                    self.b = self.b + self.eta * self.y[i]
                    count += 1
                    #print "ttt\n"
            if count == 0:
                flag = False
        return self.w,self.b

#
xArray = np.array([3,3,4,3,1,1])
xArray = xArray.reshape((3,2))
yArray = np.array([1,1,-1])

#
myPerceptron = perceptron(xArray,yArray,1)
w0,b0 = myPerceptron.train()

#
picture = showPicture(xArray,yArray,w=w0,b=b0)
picture.show()


结果

修改初始参数w0,b0 会得到不同的结果,也就是说明感知机模型得到的结果依赖初始点。这样得到的模型泛化能力也就不同。后面可以看到利用最大间隔实现的分类器(SVM)总是可以得到最大的分割超平面,这点也是SVM分类器和感知机模型的典型的一个优点。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 感知机的概念 感知机是一种用于二元分类的线性分类算法,在机器学习领域具有重要意义[^3]。作为最简单形式的人工神经网络单元,感知机由输入层和输出层组成,其中不包含隐藏层。 #### 输入与输出关系 对于给定的数据样本 \( (x_1, x_2,..., x_n) \),通过加权求和并加上偏置项 b 后传入激活函数 f() 得到最终预测结果 y: \[y = f(\sum_{i=1}^{n}(w_i * x_i)+b)\] 这里 w 表示权重向量;f() 是阶跃函数,当净输入大于等于某个阈值时返回 1 ,反之则返回 -1 或者 0 。这种机制使得感知机能有效地处理线性可分问题[^4]。 ```python import numpy as np class Perceptron(object): def __init__(self, eta=0.01, n_iter=50, random_state=1): self.eta = eta self.n_iter = n_iter self.random_state = random_state def fit(self, X, y): rgen = np.random.RandomState(self.random_state) self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1]) for _ in range(self.n_iter): errors = 0 for xi, target in zip(X, y): update = self.eta * (target - self.predict(xi)) self.w_[1:] += update * xi self.w_[0] += update errors += int(update != 0.0) return self def net_input(self, X): """Calculate net input""" return np.dot(X, self.w_[1:]) + self.w_[0] def predict(self, X): """Return class label after unit step""" return np.where(self.net_input(X) >= 0.0, 1, -1) ``` 此代码实现了单层感知器的学习过程,包括初始化权重、调整权重直至收敛等功能。 尽管如此,由于其局限性——仅能解决线性分离问题且无法提供最大间隔解法,因此在现代复杂场景下的应用受到一定限制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空空的司马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值