感知器算法是一种可以直接得到线性判别函数的线性分类方法,它是基于样本线性可分的要求下使用的


线性可分与线性不可分



算法流程

感知器作为人工神经网络中最基本的单元,有多个输入和一个输出组成。虽然我们的目的是学习很多神经单元互连的网络,但是我们还是需要先对单个的神经单元进行研究。
感知器算法的主要流程:

首先得到n个输入,再将每个输入值加权,然后判断感知器输入的加权和最否达到某一阀值v,若达到,则通过sign函数输出1,否则输出-1。

为了统一表达式,我们将上面的阀值v设为0,新增变量x0=1,这样就可以使用w0x0+w1x1+w2x2+…+wnxn。于是有:

从上面的公式可知,当权值向量确定时,就可以利用感知器来做分类。

那么我们如何获得感知器的权值呢?这需要根据训练集是否可分来采用不同的方法:

1、训练集线性可分时 --> 感知器训练法则

为了得到可接受的权值,通常从随机的权值开始,然后利用训练集反复训练权值,最后得到能够正确分类所有样例的权向量。

具体算法过程如下:

A)初始化权向量w=(w0,w1,…,wn),将权向量的每个值赋一个随机值。
B)对于每个训练样例,首先计算其预测输出:

C)当预测值不等于真实值时则利用如下公式修改权向量:

D)重复B)和C),直到训练集中没有被错分的样例。

算法分析:

若某个样例被错分了,假如目标输出t为-1,结果感知器o输出为1,此时为了让感知器输出-1,需要将wx减小以输出-1,而在x的值不变的情况下只能减小w的值,这时通过在原来w后面添加(t-o)x=即可减小w的值(t-o<0, x>0)。

通过逐步调整w的值,最终感知器将会收敛到能够将所有训练集正确分类的程度,但前提条件是训练集线性可分。若训练集线性不可分,则上述过程不会收敛,将无限循环下去。


实现算法

  1. 生成数据
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsiris = datasets.load_iris()x = iris.data
y = iris.target
# 只做一个简单的二分类
x = x[y<2, :2]
y = y[y<2]plt.scatter(x[y==0, 0], x[y==0, 1])
plt.scatter(x[y==1, 0], x[y==1, 1])
plt.show()

  1. 实现算法
def check(w, x, y):return ((w.dot(x.T)>0).astype(int)==y).all() def train(w, train_x, train_y, learn=1, max_iter=200):iter = 0while ~check(w, train_x, train_y) and iter<=max_iter:iter += 1for i in range(train_y.size):predict_y = (w.dot(train_x[i].T)>0).astype(int)if predict_y != train_y[i]:w += learn*(train_y[i] - predict_y)*train_x[i]return wdef normalize(x):max_x = np.max(x, axis=0)min_x = np.min(x, axis=0)norm_x = (max_x - x) / (max_x - min_x)return norm_xnorm_x = normalize(x)
train_x = np.insert(norm_x, 0, values=np.ones(100).T, axis=1)
w = np.random.random(3)
w = train(w, train_x, y)
  1. 绘制决策边界
def plot_decision_boundary(w, axis):x0, x1 = np.meshgrid(np.linspace(axis[0], axis[1], int((axis[1] - axis[0])*100)).reshape(1, -1),np.linspace(axis[2], axis[3], int((axis[3] - axis[2])*100)).reshape(1, -1),)x_new = np.c_[x0.ravel(), x1.ravel()]x_new = np.insert(x_new, 0, np.ones(x_new.shape[0]), axis=1)y_predict = (w.dot(x_new.T)>0).astype(int)zz = y_predict.reshape(x0.shape)from matplotlib.colors import ListedColormapcustom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)plot_decision_boundary(w, axis=[-1, 1, -1, 1])
plt.scatter(norm_x[y==0, 0], norm_x[y==0, 1], color='red')
plt.scatter(norm_x[y==1, 0], norm_x[y==1, 1], color='blue')
plt.show()


4. 使用sklearn包完成感知器算法

from sklearn.datasets import make_classificationx,y = make_classification(n_samples=1000, n_features=2,n_redundant=0,n_informative=1,n_clusters_per_class=1)#n_samples:生成样本的数量#n_features=2:生成样本的特征数,特征数=n_informative() + n_redundant + n_repeated#n_informative:多信息特征的个数#n_redundant:冗余信息,informative特征的随机线性组合#n_clusters_per_class :某一个类别是由几个cluster构成的 #训练数据和测试数据
x_data_train = x[:800,:]
x_data_test = x[800:,:]
y_data_train = y[:800]
y_data_test = y[800:]#正例和反例
positive_x1 = [x[i,0] for i in range(1000) if y[i] == 1]
positive_x2 = [x[i,1] for i in range(1000) if y[i] == 1]
negetive_x1 = [x[i,0] for i in range(1000) if y[i] == 0]
negetive_x2 = [x[i,1] for i in range(1000) if y[i] == 0]
from sklearn.linear_model import Perceptron
#定义感知机
clf = Perceptron(fit_intercept=False,shuffle=False)
#使用训练数据进行训练
clf.fit(x_data_train,y_data_train)
#得到训练结果,权重矩阵
print(clf.coef_)
#输出为:[[-0.38478876,4.41537463]]#超平面的截距,此处输出为:[0.]
print(clf.intercept_)#利用测试数据进行验证
acc = clf.score(x_data_test,y_data_test)
print(acc)
#得到的输出结果为0.98,这个结果还不错吧。
from matplotlib import pyplot as plt
#画出正例和反例的散点图
plt.scatter(positive_x1,positive_x2,c='red')
plt.scatter(negetive_x1,negetive_x2,c='blue')
#画出超平面(在本例中即是一条直线)
line_x = np.arange(-4,4)
line_y = line_x * (-clf.coef_[0][0] / clf.coef_[0][1]) - clf.intercept_
plt.plot(line_x,line_y)
plt.show()

机器学习(十二)——感知器算法相关推荐

  1. 【基础机器学习算法原理与实现】使用感知器算法LDA、最小二乘法LSM、Fisher线性判别分析与KNN算法实现鸢尾花数据集的二分类问题

    本文设计并实现了PerceptronLA.PseudoIA.LeastSM.LinearDA.KNN等五个算法类,以及DataProcessor的数据处理类.对感知器算法LDA.最小二乘法LSM的伪逆 ...

  2. 机器学习——人工神经网络之发展历史(神经元数学模型、感知器算法)

    目录 一.神经元的数学模型 ​ 二.感知器算法(SVM算法前身) 1.目的 2.流程 >>>问题1:下图w和b的调整是什么意思? 3.算法的有效性验证 1)原算法 2)增广矩阵 3) ...

  3. 机器学习之感知器算法的设计实现(多分类)

    本次实验旨在掌握感知器算法,利用它对输入的数据进行多类分类. 1.实验原理 1. 感知器基本原理 感知准则函数是五十年代由 Rosenblatt 提出的一种自学习判别函数生成方法,由于Rosenbla ...

  4. 感知器算法(Perceptron)

    目录 引言 感知器 Matlab代码 效果展示 Python代码 效果展示 C++代码 效果展示 引言 本专栏第二个机器学习算法:感知器算法,全部代码通过Github下载,使用Matlab,Pytho ...

  5. 感知器算法原理详解及python实现

    感知器算法PLA 感知器算法是对一种分类学习机模型的称呼,属于有关机器学习的仿生学领域中的问题,由于无法实现非线性分类而下马.但"赏罚概念(reward-punishment concept ...

  6. 深度学习笔记整理2 - 感知器算法

    深度学习 基本概念 深度学习是机器学习算法中的一类,其源于人工神经网络的研究. 深度学习广泛应用在计算机视觉,音频处理,自然语言处理等诸多领域. 深度可以理解为数据计算转换的层数. 机器学习& ...

  7. 人工神经网络—感知器算法

    感知器算法 1. 回顾 2. 感知器算法 2.1 感知器算法的实现步骤 2.2 算法能停得下来吗? 2.3 基于增广向量的感知器算法 2.4 感知器算法收敛定理 3. 感知器算法收敛的MATLAB程序 ...

  8. 模式识别系列(一)感知器算法(PLA)

    目录 写在前头 1.感知器算法简介 2.Perceptron Learning Algorithm(PLA) 2.1权重向量和特征向量到分类面的距离 2.2PLA的原理和流程 2.3PLA的收敛性证明 ...

  9. Perceptron Algorithm 感知器算法及其实现

    Rosenblatt于1958年发布的感知器算法,算是机器学习鼻祖级别的算法.其算法着眼于最简单的情况,即使用单个神经元.单层网络进行监督学习(目标结果已知),并且输入数据线性可分.我们可以用该算法来 ...

最新文章

  1. 成都机场迎春运客流高峰 日均起降航班超1000架次
  2. mysql page header_MySQL系列:innodb源码分析之page结构解析
  3. 统计123出现次数_如何使用 count 统计词条出现次数?
  4. python 连通区域_python skimage 连通性区域检测方法
  5. 深度学习笔记(6) 实践层面(一)
  6. 给dubbo接口添加白名单——dubbo Filter的使用
  7. 腾讯 AlloyTeam 正式发布 Canvas 魔幻线条 - curvejs
  8. 在https上面使用ws不加密_ASP.NET Core 3.1 中使用JWT认证
  9. WINDOWS调用出错后,得到信息字串
  10. windows下WDK创建免费的测试证书,并签名windows驱动文件(附带测试效果)
  11. edius多机位多轨编辑
  12. python搭建简易HTTPServer服务
  13. 中国城市云计算首站现场会成都隆重举行
  14. 漏洞解决方案-短信炸弹攻击
  15. jQuery boxy弹出层插件中文演示及讲解
  16. 计算机专业考研2021,2021考研:计算机考研方向,了解一下
  17. Effie: 一款属于程序工作者的写作软件
  18. 1761:神奇的口袋(2)
  19. Python-文件存储
  20. gif动态图怎么制作?gif动态图在线制作一键搞定

热门文章

  1. Java多线程 - ReentrantLock实际开发中的应用场景
  2. C语言实现 猴子吃桃子问题 超级详解
  3. 两种生成对称正定矩阵的方法
  4. 岗位胜任力模型三要素详解
  5. ORB(Oriented FAST and Rotated BRIEF) 特征点
  6. [Mysql] IF函数
  7. 《花雕学AI》用Edge和chrome浏览器体验GPT-4智能聊天的神奇免费插件,Sider – 聊天机器人的新选择
  8. “私车公用”下 事故责任承担
  9. 中央空调——适配器模式
  10. 保序回归(isotonic regression)