【感知机】感知机(perceptron)学习算法例题及详解

感知机( perceptron )是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1 和-1二值。感知机对应输入空间(特征空间)中将实例划分为正负两类的分离超平面,是一种判别模型。感知机是神经网络与支持向量机的基础

感知机学习旨在求出将训练数据进行线性划分的分离超平面。

感知机学习思路:

1.导入基于误分类的损失函数

2.利用梯度下降法对损失函数进行极小化

3.代入参数得到感知机模型。

感知机学习算法分类:

原始形式、对偶形式。

感知机算法原始形式例题及详解

例1 训练数据集如图所示,正实例点为x_1=(3,3)^{T},x_2=(4,3)^{T},负实例点为x_3=(1,1)^{T},试用感知机算法原始形式求感知机模型,令w=(w^{(1)},w^{(2)})^{T},x=(x^{(1)},x^{(2)})^{T}

解答:

(1)建模最优化问题:\underset{w,b}{min}L(w,b)= - \underset{x_i\in M}{\sum } y_i (w\cdot x_i+b )

(2)取初值w_0=0,b_0=0\eta =1 

(3)按x_1,x_2,x_3顺序,对x_1=(3,3)^{T},y_1(w\cdot x1+b )= 0,则x_1为误分类点。更新w,b

w_1=w_0+y_1x_1=(3,3)^{T},b_1=b_0+\eta y_1=1

得到线性模型:w_1\cdot x+b_1=3x^{(1)}+3x^{(2)}+1=0

(4)重新选取,对x_1,x_2y_i(w_1\cdot x_i+b_1)>0,则均为正确分类点,不更新w,b

x_3=(1,1)^{T}y_3(w_1\cdot x_3+b_1)< 0,则x_3为误分类点,更新w,b

w_2=w_1+y_3x_3=(2,2)^{T},b_2=b_1+\eta y_3=0

得到线性模型:w_2\cdot x+b_2=2x^{(1)}+2x^{(2)}=0

(5)由此不断迭代

(6)直到w_7=(1,1)^{T},b_7=-3

线性模型:w_7\cdot x+b_7=x^{(1)}+x^{(2)}-3=0

对所有数据点y_i(w_1\cdot x_i+b_1)>0,则确定分离超平面:x^{(1)}+x^{(2)}-3=0

感知机模型f(x)=sign(x^{(1)}+x^{(2)}-3)

分离超平面x^{(1)}+x^{(2)}-3=0是按照x_1,x_3,x_3,x_3,x_1,x_3,x_3的取点顺序得到的

例1如果更换取点顺序为x_1,x_3,x_3,x_3,x_2,x_3,x_3,x_3,x_1,x_3,x_3,得到的分离超平面为:

2x^{(1)}+x^{(2)}-5=0

由此,可知结论:感知机算法采用不同的初值或选取不同的误分类点顺序,解可以不同

感知机算法对偶形式例题及详解

例2 训练数据集如图所示,正实例点为x_1=(3,3)^{T},x_2=(4,3)^{T},负实例点为x_3=(1,1)^{T},试用感知机算法对偶形式求感知机模型,令w=(w^{(1)},w^{(2)})^{T},x=(x^{(1)},x^{(2)})^{T}

解答:

(1)取\alpha_1=0,i=1,2,3,b=0,\eta =1;

(2)计算Gram矩阵

G=\begin{bmatrix} 18 & 21 &6 \\ 21& 25&7 \\ 6 & 7 & 2 \end{bmatrix}

(3)误分条件

y_i (\sum_{j=1}^{N} \alpha _jy_jx_j\cdot x+ b)\leq 0

(4)参数更新

\alpha_i\leftarrow \alpha_i+1,b\leftarrow b+y_i

(5)迭代

(6)最终得到

w=\alpha_1x_1+\alpha_2x_2+\alpha_3x_3=2x_1+0x_2+5x_3=(1,1)^{T}

b=-3

则,分离超平面:x^{(1)}+x^{(2)}-3=0

感知机模型:f(x)=sign(x^{(1)}+x^{(2)}-3)

与原始形式一致,感知机学习算法的对偶形式迭代收敛,且存在多个解

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个使用感知机算法解决二分类问题的例子。我们使用Python和PyCharm编写代码。 假设有两个特征x1和x2,我们的目标是根据这两个特征将数据分成两个类别(0或1)。 首先,我们需要导入相关的库: ``` import numpy as np import matplotlib.pyplot as plt ``` 接下来,我们定义感知机类: ``` class Perceptron(object): def __init__(self, learning_rate=0.01, n_iterations=1000): self.learning_rate = learning_rate self.n_iterations = n_iterations def fit(self, X, y): n_samples, n_features = X.shape # 初始化权重和偏置 self.weights = np.zeros(n_features) self.bias = 0 # 训练感知机 for _ in range(self.n_iterations): for idx, x_i in enumerate(X): linear_output = np.dot(x_i, self.weights) + self.bias y_predicted = self.activation(linear_output) update = self.learning_rate * (y[idx] - y_predicted) self.weights += update * x_i self.bias += update def predict(self, X): linear_output = np.dot(X, self.weights) + self.bias y_predicted = self.activation(linear_output) return y_predicted def activation(self, x): return np.where(x >= 0, 1, 0) ``` 在这个类中,我们定义了两个方法:`fit`和`predict`。`fit`方法用于训练感知机,`predict`方法用于预测新的数据点。 在`fit`方法中,我们首先初始化权重和偏置为0。然后,我们使用循环训练感知机。对于每个样本,我们计算线性输出,然后使用激活函数计算预测值。接下来,我们计算误差并更新权重和偏置。 在`predict`方法中,我们计算线性输出,并使用激活函数计算预测值。 最后,我们使用以下代码创建数据并训练感知机: ``` X = np.array([[2, 3], [1, 2], [5, 6], [9, 7], [8, 9], [7, 6]]) y = np.array([0, 0, 0, 1, 1, 1]) model = Perceptron() model.fit(X, y) new_data = np.array([[3, 4], [5, 5], [1, 1]]) print(model.predict(new_data)) ``` 这个例子中,我们创建了一个包含6个数据点的数据集。前三个数据点属于类别0,后三个数据点属于类别1。我们使用这个数据集训练感知机,并使用新的数据点进行预测。 在PyCharm中运行代码,我们可以看到输出结果: ``` [0 1 0] ``` 这个结果表明,第一个和第三个数据点属于类别0,第二个数据点属于类别1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

F_D_Z

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

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

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

打赏作者

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

抵扣说明:

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

余额充值