感知机(perceptron)

模型:

简答的说由输入空间(特征空间)到输出空间的如下函数:

\[f(x)=sign(w\cdot x+b)
\]

称为感知机,其中,\(w\)和\(b\)表示的是感知机模型参数,\(w \in R^n\)叫做权值,\(b \in R\)叫做偏置(bias)

感知机是一种线性分类模型属于判别模型。

感知机的几何解释:线性方程:$$w \cdot x + b = 0$$对应于特征空间\(R^n\)中的一个超平面S,这个超平面将特征空间分为两个部分,位于两部分的点(特征向量)分别被分为正负两类,超平面S被称为分离超平面。

策略

首先感知机的数据集是对线性可分的数据集的,所谓线性可分就是存在这么一个超平面可以把数据完全正确的划分到两边。

感知机学习的目标就是要得出\(w \quad b\),需要确定一个(经验)损失函数,并将损失函数最小化。对于这个损失函数我们最容易想到的就是误分类的总数,但是我们也要注意到这个不能够是\(w \quad b\)的可导连续函数,所以我们选择点误分类的点到超平面的距离作为损失函数。最终得到损失函数定义为:

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

算法

这里我们用的是随机梯度下降法,思想是:首先随机选择一个分离超平面\(w_0,b_0\)然后用随机梯度下降不断最小化目标函数,最终得到完全正确的分类效果

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

1.选择初始值\(w_0,b_0\)

2.在训练集中选取数据\((x_i,y_i)\)

3.如果\(y_i(w \cdot x_i+b)\le 0\)

\[w \gets w+\eta y_i x_i$$$$b \gets b+ \eta y_i
\]

4.跳转至2,直至训练集中没有误分类点

代码实现:

w = [0, 0]
b = 0 def createDataSet():
"""
create dataset for test
"""
return [[(3, 3), 1], [(4, 3), 1], [(1, 1), -1]] def update(item):
"""
update with stochastic gradient descent
"""
global w, b
w[0] += item[1] * item[0][0]
w[1] += item[1] * item[0][1]
b += item[1] def cal(item):
"""
calculate the functional distance between 'item' an the dicision surface. output yi(w*xi+b).
"""
res = 0
for i in range(len(item[0])):
res += item[0][i] * w[i]
res += b
res *= item[1]
return res def check():
"""
check if the hyperplane can classify the examples correctly
"""
flag = False
for item in training_set:
if cal(item) <= 0:
flag = True
update(item)
if not flag:
print "RESULT: w: " + str(w) + " b: " + str(b)
return flag if __name__ == "__main__":
training_set = createDataSet()
while check():
pass

感知机学习算法的对偶形式:

1.\(\alpha \gets 0,b \gets 0\)

2.在训练集中选取数据\((x_i,y_i)\)

3.如果\(y_i(\sum_{j=1}^{N}\alpha_jy_ix_j\cdot x_i+b) \le 0\)

\[\alpha_i \gets \alpha_i+\eta$$$$b \gets b+\eta y_i
\]

4.转至2,直到没有误分类的数据

代码实现

这里主要是有一个叫做gram矩阵的东西,因为我们发现下面的计算过程中都是以内积的形式存在的,所以说这部分的值可以先算出来。\(G=[x_i*x_j]\)

import numpy as np

def createDataSet():
"""
create data set for test
"""
return np.array([[[3, 3], 1], [[4, 3], 1], [[1, 1], -1]]) def cal_gram():
"""
calculate the Gram matrix
"""
g = np.empty((len(training_set), len(training_set)), np.int)
for i in range(len(training_set)):
for j in range(len(training_set)):
g[i][j] = np.dot(training_set[i][0], training_set[j][0])
return g def update(i):
"""
update parameters using stochastic gradient descent
"""
global alpha, b
alpha[i] += 1
b = b + y[i] def cal(i):
"""
cal
"""
global alpha, b, x, y
res = np.dot(alpha * y, Gram[i])
res = (res + b) * y[i]
return res def check():
"""
check if the hyperplane can classify the examples correctly
"""
global alpha, b, x, y
flag = False
for i in range(len(training_set)):
if cal(i) <= 0:
flag = True
update(i)
if not flag:
w = np.dot(alpha * y, x)
print "RESULT: w: " + str(w) + " b: " + str(b)
return False
return True if __name__ == "__main__":
training_set = createDataSet()
alpha = np.zeros(len(training_set), np.float)
b = 0.0
Gram = None
y = np.array(training_set[:, 1])
x = np.empty((len(training_set), 2), np.float)
for i in range(len(training_set)):
x[i] = training_set[i][0]
Gram = cal_gram()
while check():
pass

本文链接

以上内容参考自《统计学习方法》

感知机(perceptron)概念与实现的更多相关文章

  1. 2. 感知机(Perceptron)基本形式和对偶形式实现

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  2. 20151227感知机(perceptron)

    1 感知机 1.1 感知机定义 感知机是一个二分类的线性分类模型,其生成一个分离超平面将实例的特征向量,输出为+1,-1.导入基于误分类的损失函数,利用梯度下降法对损失函数极小化,从而求得此超平面,该 ...

  3. 感知机(perceptron)

  4. 神经网络 感知机 Perceptron python实现

    import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...

  5. 1. 感知机原理(Perceptron)

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  6. 机器学习---三种线性算法的比较(线性回归,感知机,逻辑回归)(Machine Learning Linear Regression Perceptron Logistic Regression Comparison)

    最小二乘线性回归,感知机,逻辑回归的比较:   最小二乘线性回归 Least Squares Linear Regression 感知机 Perceptron 二分类逻辑回归 Binary Logis ...

  7. 利用Python实现一个感知机学习算法

    本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...

  8. 感知机和BP神经网络

    一.感知机 1.感知机的概念 感知机是用于二分类的线性分类模型,其输入是实例的特征向量,输出是实例的类别,类别取+1和-1二个值,+1代表正类,-1代表负类.感知机对应于输入空间(特征空间)中将实例分 ...

  9. Alink漫谈(十五) :多层感知机 之 迭代优化

    Alink漫谈(十五) :多层感知机 之 迭代优化 目录 Alink漫谈(十五) :多层感知机 之 迭代优化 0x00 摘要 0x01 前文回顾 1.1 基本概念 1.2 误差反向传播算法 1.3 总 ...

随机推荐

  1. 【转】windows环境下安装win8.1+Mac OS X 10.10双系统教程

    先要感谢远景论坛里的各位大神们的帖子  没有他们的分享我也不能顺利的装上Mac OS X 10.10! 写这篇随笔主要是为了防止自己遗忘,同时给大家分享下我的经验. 本教程适用于BIOS+MBR分区的 ...

  2. 轮播插件unsilder 源码解析(二)

    $.fn._active = function(className) { //当前的添加class,相邻元素去除class return this.addClass(className).siblin ...

  3. 原生javascript 实现 animate

    原生javascript 实现 animate //animate function getstyle(obj,name){ if(obj.currentStyle){ return obj.curr ...

  4. MySQL性能优化:索引

    MySQL性能优化:索引 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引以找到特定值,然后顺指针找到包含该值的行.这样可以使对应于表的SQL语句执 ...

  5. db2look导出ddl 详细用法(转)

    DB2的db2look命令诠释如下:db2look 版本 8.2db2look:生成 DDL 以便重新创建在数据库中定义的对象语法: db2look -d DBname [-e] [-u Creato ...

  6. 配置tomcat系统日志--java eclipse

    控制台那里的日志只是部分,有时候报错了我们并没有显示出来,所以需要找到系统日志... 双击tomcat v.80 Service---点击open lauch Configuration--Argum ...

  7. AD域的安装(在Windows Server 2003中安装Active Directory)

    在Active Directory中提供了一组服务器作为身份验证服务器或登录服务器,这类服务器被称作域控制器(Domain Controller,简称DC).建立一个AD域的过程实际就是在一台运行Wi ...

  8. eclipse安装spring的插件

    第一步:插件下载 http://spring.io/tools/sts/all 安装包链接 第二步:插件安装 第三步:安装成功检测

  9. javascript 心得

    1.&&和||等逻辑判断运算标记可以当成条件运算来使用例如: var a =  b = c = "12"; (a=="13"&& ...

  10. android中xml tools属性详解

    第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...