感知机(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. SharePoint "System.Data.SqlClient.SqlException (0x80131904): Parameter '@someColumn' was supplied multiple times.“

    最近在处理SharePoint Office365的相关开发的时候发现了这样一个奇怪的现象: 无法通过API更新Editor field,只要已更新就会throw Exception,由于是Offic ...

  2. 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)

    上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...

  3. 初识exception

    一.exception的分类 根据此exception(异常)是否可以打断正在执行的指令,可以将exception分为 asynchronous exception 和 synchronous exc ...

  4. 关于LESS

    LESS 是动态的样式表语言,通过简洁明了的语法定义,使编写 CSS 的工作变得非常简单. 翻译成大白话:写CSS算是体力活,并没有编程的感觉,不给前端人员装逼的机会,于是就搞了这玩意,相当于编程写C ...

  5. NancyFX 简介

    Nancy是.NET 平台的微框架.在受到Ruby社区的Sinatra框架启发下,NancyFx框架提供一个.NET平台下的低门槛.易上手的可用于Web开发工具包. 请注意我说的是可用于Web开发,这 ...

  6. solr基本入门

    一直想接触下搜索,虽然之前也玩了下solr,但一直没深入,所以也都忘得差不多了,现在solr都6.1了,发展真快.重新拾起,记录下也好,为以后出问题查找起来快一点. 1.搜索最重要的概念就是倒排索引, ...

  7. Thrift的TJsonProtocol协议分析

    Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...

  8. s:if 判断

    判断 ArrayList size 是否为0 <s:if test="list.size==0"> <s:if> <s:else> </s ...

  9. nubia Z5 mini 小牛 黑砖qhsusb dload修复

    给手机分区,用了分区助手,将一些分区移动. 结果分区坏了,只有两三个分区在电脑显示,当时晕菜把数据线拔了重插. 手机变砖,不能启动,黑屏,不能进recovery... 参考 http://bbs.nu ...

  10. BZOJ4591——[Shoi2015]超能粒子炮·改

    1.题意:求 2.分析:公式恐惧症的同学不要跑啊QAQ 根据lucas定理-- 这一步大家都能懂吧,这是浅而易见的lucas定理转化过程,将每一项拆分成两项 那么下一步,我们将同类项合并 我们观察可以 ...