Python机器学习算法实现

Author:louwill

今天笔者要实现的机器学习算法是感知机(perceptron)。感知机是一种较为简单的二分类模型,但由简至繁,感知机却是神经网络和支持向量机的基础。感知机旨在学习能够将输入数据划分为+1/-1的线性分离超平面,所以说整体而言感知机是一种线性模型。因为是线性模型,所以感知机的原理并不复杂,本节笔者就和大家来看一下感知机的基本原理和Python实现。

感知机原理

假设输入x表示为任意实例的特征向量,输出y={+1,-1}为实例的类别。感知机定义由输入到输出的映射函数如下:

其中sign符号函数为:

w和b为感知机模型参数,也是感知机要学习的东西。w和b构成的线性方程wx+b=0极为线性分离超平面。

假设数据是线性可分的,当然有且仅在数据线性可分的情况下,感知机才能奏效。感知机模型简单,但这也是其缺陷之一。所谓线性可分,也即对于任何输入和输出数据都存在某个线性超平面wx+b=0能够将数据集中的正实例点和负实例点完全正确的划分到超平面两侧,这样数据集就是线性可分的。

感知机的训练目标就是找到这个线性可分的超平面。为此,定义感知机模型损失函数如下:

要优化这个损失函数,可采用梯度下降法对参数进行更新以最小化损失函数。计算损失函数关于参数w和b的梯度如下:

由上可知完整的感知机算法包括参数初始化、对每个数据点判断其是否误分,如果误分,则按照梯度下降法更新超平面参数,直至没有误分类点。

以上便是感知机算法的基本原理。当然这里说的感知机仅限于单层的感知机模型,仅适用于线性可分的情况。对于线性不可分的情形,笔者将在后续的神经网络和感知机两讲详细介绍。

感知机算法实现

完整的感知机算法包括参数初始化、模型主体、参数优化等部分,我们便可以按照这个思路来实现感知机算法。在正式写模型之前,我们先用sklearn来准备一下示例数据。

# 导入相关库
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt# 导入iris数据集
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['label'] = iris.target
df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']# 绘制散点图
plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], c='red', label='0')
plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], c='green', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend();

# 取两列数据并将并将标签转化为1/-1
data = np.array(df.iloc[:100, [0, 1, -1]])
X, y = data[:,:-1], data[:,-1]
y = np.array([1 if i == 1 else -1 for i in y])

下面正式开始模型部分。先定义一个参数初始化函数:

# 定义参数初始化函数
def initilize_with_zeros(dim):w = np.zeros(dim)b = 0.0return w, b

然后定义sign符号函数:

# 定义sign符号函数
def sign(x, w, b):return np.dot(x,w)+b

最后定义模型训练和优化部分:

# 定义感知机训练函数
def train(X_train, y_train, learning_rate):# 参数初始化w, b = initilize_with_zeros(X_train.shape[1])# 初始化误分类is_wrong = Falsewhile not is_wrong:wrong_count = 0for i in range(len(X_train)):X = X_train[i]y = y_train[i]# 如果存在误分类点# 更新参数# 直到没有误分类点if y * sign(X, w, b) <= 0:w = w + learning_rate*np.dot(y, X)b = b + learning_rate*ywrong_count += 1if wrong_count == 0:is_wrong = Trueprint('There is no missclassification!')# 保存更新后的参数params = {'w': w,'b': b}return params

对示例数据进行训练:

params = train(X, y, 0.01)
params

最后对训练结果进行可视化,绘制模型的决策边界:

x_points = np.linspace(4, 7, 10)
y_hat = -(params['w'][0]*x_points + params['b'])/params['w'][1]
plt.plot(x_points, y_hat)plt.plot(data[:50, 0], data[:50, 1], color='red', label='0')
plt.plot(data[50:100, 0], data[50:100, 1], color='green', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

最后,我们也可以建一个perceptron类来方便调用。对上述代码进行整理:

class Perceptron:def __init__(self):passdef sign(self, x, w, b):return np.dot(x, w) + bdef train(self, X_train, y_train, learning_rate):# 参数初始化w, b = self.initilize_with_zeros(X_train.shape[1])# 初始化误分类is_wrong = Falsewhile not is_wrong:wrong_count = 0for i in range(len(X_train)):X = X_train[i]y = y_train[i]# 如果存在误分类点# 更新参数# 直到没有误分类点if y * self.sign(X, w, b) <= 0:w = w + learning_rate*np.dot(y, X)b = b + learning_rate*ywrong_count += 1if wrong_count == 0:is_wrong = Trueprint('There is no missclassification!')# 保存更新后的参数params = {'w': w,'b': b}return params

以上便是本节内容。完整代码文件和数据可参考我的GitHub地址:

https://github.com/luwill/machine-learning-code-writing

参考资料:

李航 统计学习方法

https://github.com/fengdu78/lihang-code

往期精彩:

数学推导+纯Python实现机器学习算法3:k近邻

数学推导+纯Python实现机器学习算法2:逻辑回归

数学推导+纯Python实现机器学习算法1:线性回归

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am本站qq群1003271085。加入微信群请扫码进群:

【机器学习基础】数学推导+纯Python实现机器学习算法6:感知机相关推荐

  1. 【机器学习基础】数学推导+纯Python实现机器学习算法30:系列总结与感悟

    Python机器学习算法实现 Author:louwill Machine Learning Lab 终于到了最后的总结.从第一篇线性回归的文章开始到现在,已经接近有两年的时间了.当然,也不是纯写这3 ...

  2. 【机器学习基础】数学推导+纯Python实现机器学习算法24:HMM隐马尔可夫模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab HMM(Hidden Markov Model)也就是隐马尔可夫模型,是一种由隐藏的马尔可夫链随机 ...

  3. 【机器学习基础】数学推导+纯Python实现机器学习算法28:CRF条件随机场

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文我们来看一下条件随机场(Conditional Random Field,CRF)模型.作为概 ...

  4. 【机器学习基础】数学推导+纯Python实现机器学习算法27:EM算法

    Python机器学习算法实现 Author:louwill Machine Learning Lab 从本篇开始,整个机器学习系列还剩下最后三篇涉及导概率模型的文章,分别是EM算法.CRF条件随机场和 ...

  5. 【机器学习基础】数学推导+纯Python实现机器学习算法26:随机森林

    Python机器学习算法实现 Author:louwill Machine Learning Lab 自从第14篇文章结束,所有的单模型基本就讲完了.而后我们进入了集成学习的系列,整整花了5篇文章的篇 ...

  6. 【机器学习基础】数学推导+纯Python实现机器学习算法25:CatBoost

    Python机器学习算法实现 Author:louwill Machine Learning Lab 本文介绍GBDT系列的最后一个强大的工程实现模型--CatBoost.CatBoost与XGBoo ...

  7. 【机器学习基础】数学推导+纯Python实现机器学习算法24:LightGBM

    Python机器学习算法实现 Author:louwill Machine Learning Lab 第17讲我们谈到了竞赛大杀器XGBoost,本篇我们来看一种比XGBoost还要犀利的Boosti ...

  8. 【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类

    Python机器学习算法实现 Author:louwill Machine Learning Lab 聚类分析(Cluster Analysis)是一类经典的无监督学习算法.在给定样本的情况下,聚类分 ...

  9. 【机器学习基础】数学推导+纯Python实现机器学习算法22:最大熵模型

    Python机器学习算法实现 Author:louwill Machine Learning Lab 最大熵原理(Maximum Entropy Principle)是一种基于信息熵理论的一般原理,在 ...

  10. 【机器学习基础】数学推导+纯Python实现机器学习算法21:马尔可夫链蒙特卡洛...

    Python机器学习算法实现 Author:louwill Machine Learning Lab 蒙特卡洛(Monte Carlo,MC)方法作为一种统计模拟和近似计算方法,是一种通过对概率模型随 ...

最新文章

  1. 2016-2017 ACM-ICPC Pacific Northwest Regional Contest (Div. 2) 【部分题解】
  2. java正则表达式入门文档
  3. SAP PP顾问面试题及资料
  4. 回顾 | Apache Flink 1.13 新版本 x 互娱实践分享 Meetup · 北京站精彩回顾 (附 PPT 下载)
  5. HarmonyOS之AI能力·文档检测校正
  6. oo面向对象第一单元总结
  7. 工业以太网交换机可以家用吗?
  8. 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
  9. Linux系统下MySQL导出数据库和导入数据库的命令
  10. C++:成绩类Score
  11. dup_val_on_index_oracle学习笔记(十六) PL/SQL 异常和goto语句
  12. Python中各种括号的区别、用途及使用方法
  13. 直接读取Excel文件数据
  14. Spring boot中使用Jackson ObjectMapper注入
  15. 电子邮件验证及部分常用正则表达式
  16. 小米笔记本Air13.3扩充硬盘
  17. 如何写论文的report(一)
  18. 老王学JAVA一个月零三天
  19. 一日精通python编程_爱上Python:一日精通Python编程
  20. 1.4 计算机网络的定义和分类

热门文章

  1. CATALAN数 学习
  2. AssetBundle
  3. 洛谷 [SDOI2015]约数个数和 解题报告
  4. MSM 实现 tomcat session 共享
  5. 一个测试员的工作与学习
  6. 计算数组的逆序对个数
  7. js中对于字符串非空判断的总结
  8. 自定义曲线_完美动力小课堂:AnimationCurve(动画曲线编辑) 如何使用?
  9. Office 办公软件的问题解决方案
  10. 一篇文章了解蛋白质组学研究