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)\)

  1. 赋初值 \(w_0,b_0\)
  2. 选取数据点\((x_i,y_i)\)
  3. 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(w\cdot {x_i}+b)<=0\)则更新

\[w={w+\eta{y_ix_i}}
\]

\[b={b+\eta{y_i}}
\]

  1. 转到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={w+\eta{y_ix_i}}
\]

\[b={b+\eta{y_i}}
\]

我们的\(w,b\)经过了\(n\)次修改后的,参数可以变化为下公式,其中\(\alpha = ny\):

\[w=\sum_{x_i\in{M}}\eta{y_ix_i}=\sum_{i=1}^n\alpha_iy_ix_i
\]

\[b=\sum_{x_i\in{M}}\eta{y_i}=\sum_{i=1}^n\alpha_iy_i
\]

这样我们就得出了感知机的对偶算法。

输入:训练数据集\(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\)

  1. 赋初值 \(\alpha_0,b_0\)
  2. 选取数据点\((x_i,y_i)\)
  3. 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(\sum_{j=1}^n\alpha_jy_jx_j\cdot {x_i}+b)<=0\)则更新

\[\alpha_i={\alpha_i+\eta}
\]

\[b={b+\eta{y_i}}
\]

  1. 转到2,直到训练集中没有误分类点

为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵

\[G=[x_i,x_j]_{N×N}
\]

主要实现代码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)基本形式和对偶形式实现的更多相关文章

  1. 感知机(perceptron)概念与实现

    感知机(perceptron) 模型: 简答的说由输入空间(特征空间)到输出空间的如下函数: \[f(x)=sign(w\cdot x+b)\] 称为感知机,其中,\(w\)和\(b\)表示的是感知机 ...

  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. 3. 支持向量机(SVM)拉格朗日对偶性(KKT)

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

  7. 6. 支持向量机(SVM)核函数

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

  8. 5. 支持向量机(SVM)软间隔

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

  9. 4. 支持向量机(SVM)原理

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

随机推荐

  1. Rplidar学习(三)—— ROS下进行rplidar调试

    一.建立工作空间.编译包 mkdir -p ~/catkin_rplidar/src #创建目录 cd ~/catkin_rplidar/src #打开目录 #下载rplidar_ros数据包,进行移 ...

  2. Spring Cloud启动应用时指定IP或忽略某张网卡配置

    说明:分布式应用部署到服务上,由于服务器可能存在多张网卡,造成IP地址不准的问题. 解决方法: 1.直接添加忽略某张网卡的配置: spring.cloud.inetutils.ignored-inte ...

  3. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  4. JDBC连接SQLServer出现的异常

    数据库连接.  question1. java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver 异常 ...

  5. ural 1091. Tmutarakan Exams(容斥)

    http://acm.timus.ru/problem.aspx? space=1&num=1091 从1~s中选出k个数,使得k个数的最大公约数大于1,问这种取法有多少种. (2<=k ...

  6. Bitter Sweet Symphony

    当我写下这段话时,另一个我觉醒了. 时间仿佛一下子从2013年的末尾跳到了2014年了,是那么的猝不及防.1990——2014,24岁了,一瞬间,不知不觉已经走过了24个岁月了.过去,我时常会反省着, ...

  7. 关于 f 散度

    在概率统计中,f散度是一个函数,这个函数用来衡量两个概率密度p和q的区别,也就是衡量这两个分布多么的相同或者不同. 1.f散度的定义p和q是同一个空间中的两个概率密度函数,它们之间的f散度可以用如下方 ...

  8. java字符串拼接的几种方式

    1. plus方式 当左右两个量其中有一个为String类型时,用plus方式可将两个量转成字符串并拼接. String a="";int b=0xb;String c=a+b;2 ...

  9. win7重命名文件时 提示 “指定的设备名无效”的解决办法

    同事从mac上传一个文件夹到win7上,但是少了一张图片con.jpg.查了半天发现将备份文件改名为con.jpg时提示 “指定的设备名无效”. 谷歌了下,发现了问题所在.坑爹的win7. 从不同的系 ...

  10. spring 项目中在类中注入静态字段

    有时spring 项目中需要将配置文件的属性注入到类的静态字段中 例如:文件上传 //文件上传指定上传位置 //resource-dev.properties 有如下参数 #upload UPLOAD ...