感知器python
感知器学习的目标是求得一个能够将训练集正实例点和负实例点·完全正确分开的分离超平面。即找到这超平面的参数w,b。
超平面定义
w*x+b=0
其中w是参数,x是数据。公式很好理解以二维平面为例,w有两个参数x0,x1。确定其中一个参数x0就可以确定另一个参数x1所以,二维中超平面w*x+b=0就是一条直线。三维中,w有三个参数w0,w1,w2。确定其中两个就可以确定另一个参数,所以超平面是一个面。
找到超平面后,超平面上面的是的是正类,下面的是负类,可以将线性可分数据集分开。 其中定义中的w是超平面的法向量,因为对于二维平面,w*x1-b=0,w*x2-b=0。联立得w*(x1-x2)=0,而x1,x2是线段上的点,因此x1-x2表示此线段的一个向量,w与(x1,x2)做点积等于0,因此w垂直与此向量,即w垂直于超平面。
知道w垂直与超平面即可以推出空间上的一个点x0到超平面的距离公式为|w*x0+b|÷||w||。推导在这里
请问d=|Ax0+By0+C|/√(A²+B²)是什么公式?从哪里推出的? - silvergin的回答 - 知乎 https://www.zhihu.com/question/56356774/answer/148814257
对于误分类的点(xi,yi)来说,-yi(w*xi+b)>0,因为如果分类错误,那么预测的y与真实标签值符号相反,所以相乘等于-1,加个负号等于+1,大于0.(假设正类标签为1,负类标签为-1)
因此将所有的误分类点加起来得到损失函数。
,不考虑可
,以得到
即为损失函数,我们只要优化这个函数,就能求得超平面的参数w,跟b
优化方法极为梯度下降法,梯度公式为:对w求偏导为,
,对b求偏导为
。
下面给出代码:
import numpy as np
from matplotlib import pyplot as plt
def data(num):
'''
生成线性可分数据集,分界线为x0-x1+100=0
:param num:
:return:
'''
X = np.random.randint(0,101,(2,num))
y = np.zeros(num)
y[X[0,:]>=(100-X[1,:])] = 1
y[X[0,:]<(100-X[1,:])] = -1
return X,y
def plot_data(X,y,w,b):
'''
绘制散点图
:param X:
:param y:
:param w:
:param b:
:return:
'''
plt.scatter(X[0,y==1],X[1,y==1],s=15,c='b',marker='o')
plt.scatter(X[0,y==-1],X[1,y==-1],s=15,c='g',marker='x')
plt.plot([0,-b/w[0]],[-b/w[1],0],c='r')
plt.show()
def mistake(X,y,w,b):
'''
找到错误分类
:param X:
:param y:
:param w:
:param b:
:return:
'''
return y*(w.dot(X)+b)<0
def compute_cost(X,y,w,b,c):
'''
计算损失值
:param X:
:param y:
:param w:
:param b:
:param c:
:return:
'''
return -np.sum(y[c]*(w.dot(X[:,c])+b))
def grad(X,y,c):
'''
计算梯度
:param X:
:param y:
:param c:
:return:
'''
dw = -np.sum(y[c]*X[:,c],axis=1)
db = -np.sum(y[c])
return dw,db
def updata_parameters(w,b,dw,db,learning_rate):
'''
梯度下降,更新参数
:param w:
:param b:
:param dw:
:param db:
:param learning_rate:
:return:
'''
w = w-learning_rate*dw
b = b-learning_rate*db*100
return w,b
#生成线性可分数据集,初始化参数
X,y = data(50)
w = np.random.rand(2)
b = 0
#计算错误分类点,求损失值
c = mistake(X,y,w,b)
cost = compute_cost(X,y,w,b,c)
i = 0
#当有错位分类点不停迭代
while cost>0:
# if i%500==0:
# print('迭代{0}次,损失值为{1}:'.format(i,cost))
dw,db = grad(X,y,c)#计算梯度
w,b = updata_parameters(w,b,dw,db,0.001)#更新参数
c = mistake(X,y,w,b)#求错误分类点,bool数组形式
cost = compute_cost(X,y,w,b,c)#计算损失值
i = i+1
#绘制图像,打印参数
plot_data(X,y,w,b)
print(w,b)
输出为:

最好设定迭代次数,因为学习速率与生成的数据集的原因可能会迭代很差时间才会求出结果。学习速率过大,导致在正确结果附近跌宕。学习速率过小导致学习速度缓慢。
书上还提到了,感知器算法的对偶形式,对偶形式的讲解在这里
如何理解感知机学习算法的对偶形式? - 知乎 https://www.zhihu.com/question/26526858
参考:李航,统计学习方法
感知器python的更多相关文章
- 最简单的神经网络-感知器-python实现
import numpy as np import matplotlib.pyplot as plt X=np.array([[1,3,3], [1,4,3], [1,1,1]]) Y=np.arra ...
- 感知器算法--python实现
写在前面: 参考: 1 <统计学习方法>第二章感知机[感知机的概念.误分类的判断] http://pan.baidu.com/s/1hrTscza 2 点到面的距离 3 梯度 ...
- 机器学习之感知器算法原理和Python实现
(1)感知器模型 感知器模型包含多个输入节点:X0-Xn,权重矩阵W0-Wn(其中X0和W0代表的偏置因子,一般X0=1,图中X0处应该是Xn)一个输出节点O,激活函数是sign函数. (2)感知器学 ...
- 感知器及其Python实现
感知器是由美国计算机科学家罗森布拉特(F.Roseblatt)于1957年提出的.感知器可谓是最早的人工神经网络.单层感知器是一个具有一层神经元.采用阈值激活函数的前向网络.通过对网络权值的训练,可以 ...
- Python实现感知器的逻辑电路(与门、与非门、或门、异或门)
在神经网络入门回顾(感知器.多层感知器)中整理了关于感知器和多层感知器的理论,这里实现关于与门.与非门.或门.异或门的代码,以便对感知器有更好的感觉. 此外,我们使用 pytest 框架进行测试. p ...
- 感知器做二分类的原理及python实现
本文目录: 1. 感知器 2. 感知器的训练法则 3. 梯度下降和delta法则 4. python实现 1. 感知器[1] 人工神经网络以感知器(perceptron)为基础.感知器以一个实数值向量 ...
- python之感知器-从零开始学深度学习
感知器-从零开始学深度学习 未来将是人工智能和大数据的时代,是各行各业使用人工智能在云上处理大数据的时代,深度学习将是新时代的一大利器,在此我将从零开始记录深度学习的学习历程. 我希望在学习过程中做到 ...
- 机器学习:Python实现单层Rosenblatt感知器
如果对Rosenblatt感知器不了解,可以先查看下相关定义,然后对照下面的代码来理解. 代码中详细解释了各步骤的含义,有些涉及到了数学公式的解释. 这篇文章是以理解Rosenblatt感知器的原理为 ...
- python机器学习——感知器
最近在看机器学习相关的书籍,顺便把每天阅读的部分写出来和大家分享,共同学习探讨一起进步!作为机器学习的第一篇博客,我准备从感知器开始,之后会慢慢更新其他内容. 在实现感知器算法前,我们需要先了解一下神 ...
随机推荐
- WebService或HTTP服务端接收请求转发消息到另一个服务端-实现思路
1.需求结构(WebService) A客户端<->B服务端<->C服务端 说明: a.在B服务端上面添加配置项(1.是否转发消息到C服务端:2.C服务端IP和端口): b.A ...
- RabbitMQ之发布订阅【译】
在上一节中我们创建了一个工作队列,最好的情况是工作队列能够把任务恰到好处的分配给每一个worker.这一节中我们将做一些完全不同的事情--将消息传递给每一个消费者,这种模式被称为发布/订阅. 为了说明 ...
- linux系统中/etc/syslog.conf文件解读
1: syslog.conf的介绍 对于不同类型的Unix,标准UnixLog系统的设置,实际上除了一些关键词的不同,系统的syslog.conf格式是相同的.syslog采用可配置的.统一的系统登记 ...
- java 包 和 物理目录 解惑
今天做 JUnit 实验, 发现在物理实际不同的目录(src, testsrc)下可以使用相同的包名, 并且在这两个目录下, 都有个子目录 coolUnit (这个子目录是配合 package 使用的 ...
- JQuery EasyUI DataGrid动态合并(标题)单元) 一
JS: /** * EasyUI DataGrid根据字段动态合并单元格 * @param fldList 要合并table的id * @param fldList 要合并的列,用逗号分隔(例如:&q ...
- Swing与AWT在事件模型处理上是一致的
Swing与AWT在事件模型处理上是一致的. Jframe实际上是一堆窗体的叠加. Swing比AWT更加复杂且灵活. 在JDK1.4中,给JFRAME添加Button不可用jf.add(b).而是使 ...
- 静态内部类定义在类中,任何方法外,用static定义
静态内部类:(注意:前三种内部类与变量类似,所以可以对照参考变量) 静态内部类定义在类中,任何方法外,用static定义. 静态内部类只能访问外部类的静态成员. 生成(new)一个静态内部类不需要外部 ...
- Eclipse & Visual Studio
VS中的解决方案 vs Eclipse中的workspace Maven包管理 vs Nuget类库管理 build path vs
- C++中的自动存储、静态存储和动态存储
根据用于分配内存的方法,C++中有3中管理数据内存的方式:自动存储.静态存储和动态存储(有时也叫做自由存储空间或堆).在存在是间的长短方面,以这三种方式分配的数据对象各不相同.下面简要介绍这三种类型( ...
- 微软发布新版 Skype Linux 客户端
导读 前两天,微软说要给Linux 用户带来一个令人兴奋的新闻,今天,这个新闻来了.它刚刚为 Linux 发布了一个新的 Skype 客户端.此次发布,微软为 Linux 带来的 Skype 客户端与 ...