2. 感知机(Perceptron)基本形式和对偶形式实现
1. 感知机原理(Perceptron)
2. 感知机(Perceptron)基本形式和对偶形式实现
3. 支持向量机(SVM)拉格朗日对偶性(KKT)
4. 支持向量机(SVM)原理
5. 支持向量机(SVM)软间隔
6. 支持向量机(SVM)核函数
1. 前言
今天终于能把感知机的实现补上了,感知机的原理在1. 感知机原理(Perceptron)中已经详尽的介绍,今天就是对感知机的两种实现方式,进行讲解。
2. 感知机实现
2.1 原始形式算法
假设读者们已经了解了感知机的原始形式的原理(不熟悉的请看1. 感知机原理(Perceptron)原始形式),下面是原始形式的步骤,方便对照后面的代码。
原始形式的步骤:
输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\),\(y_i\in{\{-1,+1\}}\),学习率\(\eta(0<\eta<1)\)
输出:\(w,b\);感知机模型\(f(x)=sign(w\cdot {x}+b)\)
- 赋初值 \(w_0,b_0\)
- 选取数据点\((x_i,y_i)\)
- 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(w\cdot {x_i}+b)<=0\)则更新
\]
\]
- 转到2,直到训练集中没有误分类点
主要实现代码GitHub:
def fit(self, X, y):
# 初始化参数w,b
self.w = np.zeros(X.shape[1])
self.b = 0
# 记录所有error
self.errors_ = []
for _ in range(self.n_iter):
errors = 0
for xi, yi in zip(X, y):
update = self.eta * (yi - self.predict(xi))
self.w += update * xi
self.b += update
errors += int(update != 0.0)
if errors == 0:
break
self.errors_.append(errors)
return self
2.2 对偶形式算法
假设读者们已经了解了感知机的对偶形式的原理(不熟悉的请看1. 感知机原理(Perceptron)对偶形式),下面是对偶形式的步骤,方便对照后面的代码。
对偶形式的步骤:
由于\(w,b\)的梯度更新公式:
\]
\]
我们的\(w,b\)经过了\(n\)次修改后的,参数可以变化为下公式,其中\(\alpha = ny\):
\]
\]
这样我们就得出了感知机的对偶算法。
输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\),\(y_i\in{\{-1,+1\}}\),学习率\(\eta(0<\eta<1)\)
输出:\(\alpha,b\);感知机模型\(f(x)=sign(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x}+b)\)
其中\(\alpha=(\alpha_1,\alpha_2,...,\alpha_n)^T\)
- 赋初值 \(\alpha_0,b_0\)
- 选取数据点\((x_i,y_i)\)
- 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x_i}+b)<=0\)则更新
\]
\]
- 转到2,直到训练集中没有误分类点
为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵
\]
主要实现代码GitHub:
def fit(self, X, y):
"""
对偶形态的感知机
由于对偶形式中训练实例仅以内积的形式出现
因此,若事先求出Gram Matrix,能大大减少计算量
"""
# 读取数据集中含有的样本数,特征向量数
n_samples, n_features = X.shape
self.alpha, self.b = [0] * n_samples, 0
self.w = np.zeros(n_features)
# 计算Gram_Matrix
self.calculate_g_matrix(X)
i = 0
while i < n_samples:
if self.judge(X, y, i) <= 0:
self.alpha[i] += self.eta
self.b += self.eta * y[i]
i = 0
else:
i += 1
for j in range(n_samples):
self.w += self.alpha[j] * X[j] * y[j]
return self
3. 小结
感知机算法是一个简单易懂的算法,自己编程实现也不太难。前面提到它是很多算法的鼻祖,比如支持向量机算法,神经网络与深度学习。因此虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。
2. 感知机(Perceptron)基本形式和对偶形式实现的更多相关文章
- 感知机(perceptron)概念与实现
感知机(perceptron) 模型: 简答的说由输入空间(特征空间)到输出空间的如下函数: \[f(x)=sign(w\cdot x+b)\] 称为感知机,其中,\(w\)和\(b\)表示的是感知机 ...
- 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. 支持向量 ...
- 3. 支持向量机(SVM)拉格朗日对偶性(KKT)
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 6. 支持向量机(SVM)核函数
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 5. 支持向量机(SVM)软间隔
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
- 4. 支持向量机(SVM)原理
1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...
随机推荐
- nginx 安装SSL安全证书
安装证书 文件说明: 1. 证书文件214051493730988.pem,包含两段内容,请不要删除任何一段内容. 2. 如果是证书系统创建的CSR,还包含:证书私钥文件214051493730988 ...
- Pusher 消息推送测试工具
1.Pusher 简介 Pusher 是一款为 iOS.Mac App 提供推送测试的小工具. 其它下载地址 Pusher v0.7.3 for Mac,密码:p19i. 2.使用方法 使用方法简介 ...
- Xcode dSYM 文件
1.什么是 dSYM 文件 Xcode 编译项目后,我们会看到一个同名的 dSYM 文件,dSYM 是保存 16 进制函数地址映射信息的中转文件,我们调试的 symbols 都会包含在这个文件中,并且 ...
- Spark技术栈
- C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone
C#设计模式(6)——原型模式(Prototype Pattern) 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...
- python开发者框架套件总结: package 包 frameworks
python开发者的package 包 框架套件总结: frameworks 开发环境: anaconda pycharm django awesome-django : 介绍 django ...
- Bitter Sweet Symphony
当我写下这段话时,另一个我觉醒了. 时间仿佛一下子从2013年的末尾跳到了2014年了,是那么的猝不及防.1990——2014,24岁了,一瞬间,不知不觉已经走过了24个岁月了.过去,我时常会反省着, ...
- Groovy 学习手册(3)
五. Groovy 的设计模式 设计模式是一种非常好的方式,可以使你的代码变得实用,可读又具有扩展性.跟 Java 相比,在 Groovy 里使用设计模式使代码更加简洁和容易. 1. 策略模式 设想一 ...
- jmeter响应信息unicode 编码转成中文
在jmeter 发送请求过程中,有时候后台返回的是unicode 代码,如: {"status":-1,"msg":"\u63d0\u4ea4\u65 ...
- linux进程后台运行,且关终端后继续运行
ctrl+z,fg,bg什么的都无法实现这一点.因为关终端之后就可能出问题 常用的命令如下 nohup /home/user/yourcommand.sh & nohup /home/user ...