草庐IT

感知机

QIAN 2023-04-20 原文

感知机

一、感知机模型(感知机的目标是:求一个能够将训练集正实例和负实例完全正确分开的的超平面。)

感知机是二分类线性模型,输入是实例的特征向量,输出为实例的类别,取+1和-1。感知机学习算法简单易学分为原始形式和对偶形式。

假设输入空间X\(\subseteq\)Rn,输出空间是Y={+1,-1},输入x\(\subseteq\)X表示实例的特征量,对应于输入空间的点,输出y\(\in\)Y表示实例的类别,由输入空间到输出空间的如下数:

\[f(x)=sign(w{\cdot}x+b){\quad}{\quad}{\quad}{\quad}(1.1) \]

\[sign(x) = \begin{cases} +1, & \text {if x$\geq$0}\\ -1, & \text {if x<0}{\quad}{\quad}{\quad}{\quad}{\quad}(1.2) \end{cases} \]

称为感知机。其中w和b为感知机模型参数,sign(\(\cdot\))是符号函数。感知机是一种线性分类器模型,属于判别模型。感知机模型的假设空间是定义在特征空间中所有的线性分类器模型或线性分类器。感知机有如下集合解释:线性方程

\[w{\cdot}x+b=0{\quad}{\quad}{\quad}{\quad}{\quad}{\quad}(1.3) \]

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

图1

感知机学习,由训练数据集

\[T={(x_1,y_1,(x_2,y_2),(x_3,y_3),\cdots,(x_n,y_n)} \]

其中,xi\(\subseteq\)X=Rn,yi\(\subseteq\)Y={+1,-1},i=1,2,\(\cdots\),N,求得感知机。通过感知机预测,对于一个新的输入会给出对应的输出。

二、感知机学习策略

在这里我们将感知机形象化。针对平面上(如图2)一群随机的点,找到一条合适的直线\(y=w{\cdot}x+b\),将这群点分为两大类。

图2

产生图2的代码如下:

# 2022.9.13
# 一只野生小小钱
# 随机生成点
import numpy as np
import matplotlib.pyplot as plt
x = []
y = []
num = 1000
# numpy.random.normal(loc, scale, size=None)    loc均值,scale标准差, size输出值的维度
x1 = np.random.normal(20, 10, int(num / 2))
y1 = np.random.normal(20, 10, int(num / 2))  # 在点 (20, 10) 周围生成点
x2 = np.random.normal(60, 10, int(num / 2))
y2 = np.random.normal(60, 10, int(num / 2))  # 在点 (60, 10) 周围生成点,保证生成的点是可被划分的
for i in range(num):
    if i < num / 2:
        x.append([x1[i], y1[i]])
        y.append(-1)
    else:
        x.append([x2[int(i - num / 2)], y2[int(i - num / 2)]])
        y.append(1)
data = np.array(x)
label = np.array(y)
# np.where(condition,x,y) 当where内有三个参数时,第一个参数表示条件,当条件成立时where方法返回x,当条件不成立时where返回y
# np.where(condition) 当where内只有一个参数时,那个参数表示条件,当条件成立时,where返回的是每个符合condition条件元素的坐标,返回的是以元组的形式
idx_p = np.where(label == 1)
idx_n = np.where(label == -1)
data_p = data[idx_p]
data_n = data[idx_n]
plt.scatter(data_p[:, 0], data_p[:, 1], color='red')
plt.scatter(data_n[:, 0], data_n[:, 1], color='blue')
# plt.savefig("2.png")
plt.show()

在图2中寻找一条直线,以将图1中红蓝点分开。

图3| | | | | ---- | ---- | ---- | | | | || | | | | ---- | ---- | ---- | | | | |

产生图3的代码如下:

# 2022.9.13
# 一只野生小小钱
# 随机生成点
import numpy as np
import matplotlib.pyplot as plt
data_set = []
data_label = []
num = 1000
x1 = np.random.normal(20, 10, int(num / 2))
y1 = np.random.normal(20, 10, int(num / 2))  # 在点 (20, 10) 周围生成点
x2 = np.random.normal(60, 10, int(num / 2))
y2 = np.random.normal(60, 10, int(num / 2))  # 在点 (60, 10) 周围生成点,保证生成的点是可被划分的
for i in range(num):
    if i < num / 2:
        data_set.append([x1[i], y1[i]])
        data_label.append(-1)
    else:
        data_set.append([x2[int(i - num / 2)], y2[int(i - num / 2)]])
        data_label.append(1)

data = np.array(data_set)
label = np.array(data_label)
w = np.array([1, 1])
b = -100
f = (np.dot(data, w.T) + b) * label
idx = np.where(f <= 0)
x00 = np.arange(9, 100, 1)
y0 = (w[0] * x00 + b) / (-w[1])
idx_p = np.where(label == 1)
idx_n = np.where(label == -1)
data_p = data[idx_p]
data_n = data[idx_n]
plt.scatter(data_p[:, 0], data_p[:, 1], color='red')
plt.scatter(data_n[:, 0], data_n[:, 1], color='blue')
# plt.savefig("1.png")
plt.plot(x00, y0)
# plt.savefig("2.png")
plt.show()

从图3中可以看到这条直线的分离效果并不好。那么我们判断好与不好的依据就是直线的下方都是蓝色的点,直线的上方都是红色的点,如何实现这种方法呢?这里使用损失函数极小化的方法。为此,输入空间上的点x0到S上的距离可以定义为(这里为什么不是\(d={\frac{\mid{w{\cdot}x_0+b-y_0}\mid}{\sqrt{w^2+1}}}\),是因为有个映射的过程,如果想不通欢迎评论区留言共同讨论):

\[\frac{1}{\parallel{w}\parallel}{\mid{w{\cdot}x+b}\mid} \]

其次,对于分类错误的点(xi,yi)来说,有:\(-y_i(w{\cdot}x_i+b)>0\)(值得注意的是\(y_i{\in}\{+1,-1\}\))。错误点到S的距离可以表示为:

\[d_i=-\frac{1}{\parallel{w}\parallel}y_i{\mid{w{\cdot}x_i+b}\mid} \]

所有错误点距离的总和可以表示为:

\[d_i=-\frac{1}{\parallel{w}\parallel}{\sum_{x_i{\in}{M}}}y_i{\mid{w{\cdot}x_i+b}\mid} \]

已知训练集(xi,yi)\(\in\)M,通过训练集训练迭代不断调整\(w和b\),使\(d_i\)最小化。

三、算法流程

算法的大致可以描述为:目标是找到一个平面S让一组数据\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)\}\)分成两大类,其中\(x_i{\in}X=R^n\)\(y_i=\{+1,-1\}\)\(i=1,2,\cdots,N\)。上述问题可以转化为下面公式的解:

\[\min \limits_{w,b}L(w,b) =-{\sum_{x_i{\in}{M}}}y_i{({w{\cdot}x_i+b})} \]

\(M\)是错误点的集合。算法步骤可以表示为:首先,任意选取一个超平面(确定\(w和b\)的初始值\(w_0和b_0\)),然后使用梯度下降法不断优化目标函数。

假设\(M\)是固定不变的,那么损失函数的梯度可以表示为:

\[{\nabla}_w{L(w,b)}=-{\sum_{x_i{\in}{M}}}y_ix_i \]

\[{\nabla}_b{L(w,b)}=-{\sum_{x_i{\in}{M}}}y_i \]

通过\((x_i,y_i)\)不断对\(w和b\)进行更新:

\[w{\leftarrow}w+{\eta}y_ix_i \]

\[b{\leftarrow}b+{\eta}y_i \]

其中\(\eta\)就是学习率(也是步长),这样就不断迭代达到让目标函数最小的目的。

伪代码大致流程如下:

输入:训练集\(T=\{(x_1,y_1),(x_2,y_2),{\cdots},(x_n,y_n)\}\),其中\(x_i=X{\in}R^n\)\(y_i{\in}\{+1,-1\}\)\(i=1,2,3,{\cdots},N\),学习率\(\eta(0<{\eta}<1)\)

输出:\(w,b\)。感知机模型\(f(x)=sign(w{\cdot}x+b)\)

  1. 选取任意的\(w、b\)

  2. 在训练集中选取任意的\((x_i,y_i)\)

  3. 如果\(y_i(w{\cdot}x_i+b){\leqslant}0\)​,

    \[w{\leftarrow}w+{\eta}y_ix_i \]

    \[b{\leftarrow}b+{\eta}y_i \]

​ 4.转至(2)直到训练集中没有有误分类点。

四、对偶形式

这里对感知机的对偶形式不过多介绍,后面会有相应的感知机的对偶形式,有兴趣的评论区留言,本人也会给补上。

五、总结

与其无休止的抬杠,不如来一次思想火花的碰撞。

期待各位的批评指正和交流。

骂完博主记得给个关注!!!

有关感知机的更多相关文章

  1. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  2. ACE 编辑器中的 Javascript 智能感知 - 2

    长话短说我需要ACE编辑器中JavaScript的智能自动完成/智能感知。解释我正在使用ACE编辑器为JavaScript创建在线IDE。是否有任何库或开源项目允许JavaScript的智能自动完成。JavaScript是一种动态语言,intellisense集成对于此类语言来说是微不足道的(TypeScript确实支持这一点)。ACE编辑器仅支持使用enableBasicAutocompletion的基本自动完成功能(如SublimeText)。我需要智能自动补全,一个实时解析后端javascript并提供建议的引擎。如能提供有关此问题的任何帮助,我们将不胜感激。谢谢。

  3. javascript - Visual Studio 2012 ExtJS 智能感知 - 2

    有没有办法在VisualStudio2012中获取ExtJSintelliSense?这与新的JavaScript支持相结合将使我的ExtJS项目更易于编码。 最佳答案 在您的js文件中添加到ext-all的引用路径将提供支持。具体来说,使用ext-all-debug-w-comments提供由sencha提供的支持注释。/// 关于javascript-VisualStudio2012ExtJS智能感知,我们在StackOverflow上找到一个类似的问题:

  4. javascript - 为什么智能感知对我的 ko 对象不起作用? - 2

    我正在测试MVC3项目中试用knockout.js。我有以下结构:ProjectRootScriptsjquery-1.4.4.jsknockout-1.2.0.debug.jsetc...ViewsHomeIndex.cshtmlShared_Layout.cshtmlHTMLPage1.htm在我的_Layout.cshtml文件中,我有以下脚本block:在我的Index.cshtml文件中,我试图在我的脚本block中使用ko对象。它运行良好,但在VS设计器中,我对ko对象本身没有任何智能感知。如果我在根项目级别打开一个纯HTML文件并在其中放置一个脚本block,我会在ko对

  5. 带有 Dynamics CRM 2011 的 Javascript 智能感知 - 2

    只是想知道在DynamicsCRM2011中处理javascript文件时是否有智能感知支持?我知道如果您使用VisualStudio,您可以获得此支持,但只是想知道我们是否可以通过任何方式在CRM应用程序本身中实现它。对此有任何建议都很棒! 最佳答案 Sorryshouldhavereadmorecarefullybeforeposting.ButifyouareusingVS...参见http://blogs.msdn.com/b/crm/archive/2011/04/07/jscript-intellisense-for-f

  6. javascript - Visual Studio Code ES7/JS 智能感知 - 2

    我正在尝试使用VisualStudioCode编辑reactstarterkit中的文件项目。React项目使用Babel进行转码,因此它只有.js文件而不是.ts文件。我希望VSCode为这些文件提供适当的智能感知...包括新的async/awaitJavascript关键字。到目前为止,如果我将文件的扩展名从.js重命名为.ts,我只能让intellisense正常工作,但我不想转换整个项目只是为了适合我个人的工具选择。有没有办法让VSCode将.js文件当作.ts文件来处理...仅仅是为了ES7智能感知?我发现了threadofdiscussionaboutthis,但我不确定今

  7. javascript - 是否可以在 Visual Studio Code 的原型(prototype)访问器中启用 JS 对象智能感知? - 2

    在创建JS对象,定义一些accessor时,发现this.后无法获取intellisense示例代码:functionObj(foo){this.foo=foo;}Obj.prototype={getbar(){returnthis.//Nointellisensehere},setbar(val){this.foo=val}};但是使用Obj.prototype.test=function(){...}创建方法会让我获得智能感知。是否有任何方法可以使用用户设置为这种情况复制相同的词法分析,或者这是一个实际的缺陷/错误?编辑:这是VSCode显示的图像:如您所见,它只显示以前使用过的单

  8. javascript - 文本区域上的智能感知插件? - 2

    是否有任何jQuery插件可以在文本区域中进行智能感知?(只有javascript也能很好地工作) 最佳答案 您可以使用Autocompleteplugin在textareas上,在代码中内联指定关键字或从数据库中提取它们,检查此demopage. 关于javascript-文本区域上的智能感知插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/786382/

  9. javascript - 在 visual studio 代码中丢失了 cypress 的智能感知 - 2

    我遇到了一个很奇怪的问题。我创建了一个非常基本和简单的cypress项目,只有示例测试用例,没有任何其他devDependencies只有cypress。当我第一次在visualstudiocode中打开这个项目时,当鼠标悬停在一个方法上时,我可以看到一个带有一些签名帮助的弹出窗口,然后右键单击该方法选择“转到定义”,我可以打开该文件。在我写了一个代码“cy.”之后发生了奇怪的事情,它应该给我智能代码建议,但是没有任何建议,鼠标悬停在任何方法上,签名帮助消失了,右键单击该方法选择“转到”定义”我得到“找不到'XXX'的定义”问过很多开发者,没有人能回答,请大家帮忙,谢谢!

  10. javascript - Visual Studio 2010 中缺少 javascript 智能感知 - 2

    我很高兴在VisualStudio2010中看到javascriptintellisense,但在下面的代码中,我没有通过它看到特定对象内的所有内容if(document.images[i].parentNode.tagName=="A"“parentNode”没有出现在intellisense中,这让我觉得我输入了错误的代码,但它确实存在并且VisualStudio没有显示它..如何解决这个问题?更新进度:使用NetBeans7.1,它对我的​​JavaScript没有帮助,为VStudio2010安装了JScriptExtensions,在js编辑方面有一些改进,但在Javascr

随机推荐