感知机(perceptron)概念与实现
感知机(perceptron)
模型:
简答的说由输入空间(特征空间)到输出空间的如下函数:
\]
称为感知机,其中,\(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\)的可导连续函数,所以我们选择点误分类的点到超平面的距离作为损失函数。最终得到损失函数定义为:
\]
算法
这里我们用的是随机梯度下降法,思想是:首先随机选择一个分离超平面\(w_0,b_0\)然后用随机梯度下降不断最小化目标函数,最终得到完全正确的分类效果
感知机学习算法的原始形式
1.选择初始值\(w_0,b_0\)
2.在训练集中选取数据\((x_i,y_i)\)
3.如果\(y_i(w \cdot x_i+b)\le 0\)
\]
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\)
\]
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)概念与实现的更多相关文章
- 2. 感知机(Perceptron)基本形式和对偶形式实现
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 20151227感知机(perceptron)
1 感知机 1.1 感知机定义 感知机是一个二分类的线性分类模型,其生成一个分离超平面将实例的特征向量,输出为+1,-1.导入基于误分类的损失函数,利用梯度下降法对损失函数极小化,从而求得此超平面,该 ...
- 感知机(perceptron)
- 神经网络 感知机 Perceptron python实现
import numpy as np import matplotlib.pyplot as plt import math def create_data(w1=3,w2=-7,b=4,seed=1 ...
- 1. 感知机原理(Perceptron)
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 机器学习---三种线性算法的比较(线性回归,感知机,逻辑回归)(Machine Learning Linear Regression Perceptron Logistic Regression Comparison)
最小二乘线性回归,感知机,逻辑回归的比较: 最小二乘线性回归 Least Squares Linear Regression 感知机 Perceptron 二分类逻辑回归 Binary Logis ...
- 利用Python实现一个感知机学习算法
本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...
- 感知机和BP神经网络
一.感知机 1.感知机的概念 感知机是用于二分类的线性分类模型,其输入是实例的特征向量,输出是实例的类别,类别取+1和-1二个值,+1代表正类,-1代表负类.感知机对应于输入空间(特征空间)中将实例分 ...
- Alink漫谈(十五) :多层感知机 之 迭代优化
Alink漫谈(十五) :多层感知机 之 迭代优化 目录 Alink漫谈(十五) :多层感知机 之 迭代优化 0x00 摘要 0x01 前文回顾 1.1 基本概念 1.2 误差反向传播算法 1.3 总 ...
随机推荐
- 【CVE-2016-10009】OpenSSH < 7.4 - agent Protocol Arbitrary Library Loading
粗看了一下,发现这个漏洞还是比较鸡肋的.如果前提条件满足,该漏洞可以在ssh server执行任意指令.不过前提是:1.攻击者可以往受害者磁盘上写文件.
- C++类成员在内存中的存储及对齐方式
前言:数据对齐的基本理论参见文章:http://www.cnblogs.com/MyBlog-Richard/articles/5993448.html 一.空类的大小 C++中空类的大小是1,这是因 ...
- js设置鼠标悬停改变背景色
看了网上那么多的js鼠标悬停时事件,大多数的,说了那么多话,也没解决什么问题,现在直接贴上代码,以供参考 html: <div id="sign">this is te ...
- Git学习笔记
1.第一次提交文件的过程: 1)创建代码库:cd到要作为git代码库的文件夹下,执行git init命令. 2)设置邮箱和用户名:设置后才可提交代码,git config user.e ...
- 《JavaScript高级程序设计(第3版)》笔记-第1章-JavaScript 简介
PS:第一章内容实在不多,就把前些日子看过的记录整理了一下,先发上来. 1.1 JavaScript 简史 1.JavaScript诞生前期目的主要是为了处理这种简单的表单验证. 1.2 JavaSc ...
- php打印中文乱码
php文档的文本格式都设置成 utf-8 格式 在代码中添加 header("content-type:text/html; charset=utf-8");
- js中bind,call,apply方法的应用
最近用js的类写东西,发现一个无比蛋疼的事,那就是封装的类方法中的this指针经常会改变指向,失去上下文,导致程序错误或崩溃. 比如: function Obj(){ this.type = &quo ...
- virut详细分析
Virut分析 0x00.综合描述 virut样本的执行过程大体可以分为六步:第一步,解密数据代码,并调用解密后的代码:第二步,通过互斥体判断系统环境,解密病毒代码并执行:第三步,创建内存映射文件,执 ...
- bzoj4349: 最小树形图
最小树形图模板题…… 这种\(O(nm)\)的东西真的能考到么…… #include <bits/stdc++.h> #define N 60 #define INF 1000000000 ...
- JavaScript 常用正则表达式
==========================正则表达式=========================== 常用元字符 代码 说明 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划 ...