Python 实现简单的感知机算法
感知机
随机生成一些点和一条原始直线,然后用感知机算法来生成一条直线进行分类,比较差别
导入包并设定画图尺寸
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.rcParams['figure.figsize'] = (8.0,6.0) # 生成图的大小
随机产生数据
fig = plt.figure() # 产生新画布
figa = plt.gca() # 获取当前画布 # 产生100个点
N = 100
xn = np.random.rand(N,2)
x = np.linspace(0,1) # linspace函数可以生成元素为50的等差数列 # 随机生成一条直线
a = np.random.rand()
b = np.random.rand()
f = lambda x:a*x+b # 线性分割前面产生的点
yn = np.zeros([N,1])
for i in range(N):
if(f(xn[i,0])>=xn[i,1]):
yn[i] = 1
plt.plot(xn[i,0],xn[i,1],'bo',markersize=12) # 'bo':用蓝色圆圈标记
if(f(xn[i,0])<xn[i,1]):
yn[i] = -1
plt.plot(xn[i,0],xn[i,1],'go',markersize=12) # 'go':用绿色圆圈标记

超平面的实现
def perceptron(xn,yn,MaxIter=1000,a=0.1,w=np.zeros(3)):
'''
实现一个二维感知机
对于给定的(x,y),感知机将通过迭代寻找最佳的超平面来进行分类
输入:
xn:数据点 N*2 向量
yn:分类结果 N*1 向量
MaxIter:最大迭代次数(可选参数)
a:学习率(可选参数)
w:初始值(可选参数)
输出:
w:超平面参数使得 y=ax+b 最好地分割平面
注意:
由于初始值为随机选取,因此迭代到收敛可能需要一点时间
该函数仅为感知机的简单实现,实际需要考虑更多的内容
'''
N = xn.shape[0]
# 生成超平面
f = lambda x:np.sign(w[0]*1+w[1]*x[0]+w[2]*x[1])
# 反向传播
for _ in range(MaxIter):
i = np.random.randint(N)
if(yn[i]!=f(xn[i,:])):
w[0] = w[0] + yn[i]*a*1
w[1] = w[1] + yn[i]*a*xn[i,0]
w[2] = w[2] + yn[i]*a*xn[i,1]
return w
实际应用
w = perceptron(xn,yn) # 利用权重w,计算 y=ax+b 中的a,b
new_b = -w[0] / w[2]
new_a = -w[1] / w[2]
y = lambda x:new_a*x+new_b # 分割颜色
sep_color = (yn) / 2.0 plt.figure()
figa = plt.gca() plt.scatter(xn[:,0],xn[:,1],c=sep_color.flatten(),s=50) # s:表示点的大小
plt.plot(x,y(x),'b--',label='感知机分类结果')
plt.plot(x,f(x),'r',label='原始分类曲线')
plt.legend()
plt.title('原始曲线与感知机分类结果近似比较')
Text(0.5, 1.0, '原始曲线与感知机分类结果近似比较')

Python 实现简单的感知机算法的更多相关文章
- python 实现简单的感知机
最近在自学机器学习,记录下一些学习记录 如何用python实现一个简单的感知机 需要安装numpy库,即下面用到的np 简单的说就是 通过计算权重向量w和输入向量x的线性组合,判断该线性组合是否大于某 ...
- python 实现简单的KNN算法
from numpy import * import operator def createDataSet(): group = array([[3,104],[2,100],[1,81],[101, ...
- python实现简单关联规则Apriori算法
from itertools import combinations from copy import deepcopy # 导入数据,并剔除支持度计数小于min_support的1项集 def lo ...
- python实现简单分类knn算法
原理:计算当前点(无label,一般为测试集)和其他每个点(有label,一般为训练集)的距离并升序排序,选取k个最小距离的点,根据这k个点对应的类别进行投票,票数最多的类别的即为该点所对应的类别.代 ...
- 使用Python来编写一个简单的感知机
来表示.第二个元素是表示期望输出的值. 这个数组定义例如以下: training_data = [ (array([0,0,1]), 0), (array([0,1,1]), 1), (arra ...
- 教你用Python实现简单监督学习算法
教你用Python实现简单监督学习算法 监督学习作为运用最广泛的机器学习方法,一直以来都是从数据挖掘信息的重要手段.即便是在无监督学习兴起的近日,监督学习也依旧是入门机器学习的钥匙. 这篇监督学习教程 ...
- 机器学习---用python实现感知机算法和口袋算法(Machine Learning PLA Pocket Algorithm Application)
之前在<机器学习---感知机(Machine Learning Perceptron)>一文中介绍了感知机算法的理论知识,现在让我们来实践一下. 有两个数据文件:data1和data2,分 ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- 机器学习算法--Perceptron(感知机)算法
感知机: 假设输入空间是\(\chi\subseteq R^n\),输出空间是\(\gamma =\left( +1,-1\right)\).输入\(\chi\in X\)表示实例的特征向量,对应于输 ...
随机推荐
- weblogic性能监控
1.
- [001] leap_stage
[Description] There is a number in each stages that indicates the most stages you can leap up. Now, ...
- MGR Switch Muti-Primary to single_primary
MGR Muti-Primary 切换 single_primary 模式 原因:因为希望做ProxySQL+MGR之间Proxy层的消耗测试,需要把原有的MGR多主改为单主模式. 修改MGRgrou ...
- javascript你不知道的This
<你不知道的javascript>这本书读了有好几遍了,似乎每一次读都有新发现,有些内容并不是一下子可以弄懂的,每次读似乎都能明白一些概念.再重读一下this关键字.这个概念非常灵活,也非 ...
- ssh连接不上排查方法总结
//常见报错信息 # No route to host --> server端没有开机或是网络不通(这个原因很多,最简单的是网线没有插.还有就是可能会是网卡down了等) 如果是网卡down了i ...
- 13.Python3标准库--互联网
(一)urllib.parse:分解url urllib.parse模块提供了一些函数,可以管理URL以及组成部分 1.解析 from urllib.parse import urlparse ''' ...
- javadoc生成word接口文档
1.下载DocFlex/Doclet 下载地址 http://www.filigris.com/downloads/ 2.ecplise->project->generate javado ...
- LSTM及其变种及其克服梯度消失
本宝宝又转了一篇博文,但是真的很好懂啊: 写在前面:知乎上关于lstm能够解决梯度消失的问题的原因: 上面说到,LSTM 是为了解决 RNN 的 Gradient Vanish 的问题所提出的.关于 ...
- 数据库连接池(c3p0与druid)
1.数据库连接池概念 其实就是一个容器(集合),存放数据库连接的容器.当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归 ...
- POJ 3026 Borg Maze(Prim+bfs求各点间距离)
题目链接:http://poj.org/problem?id=3026 题目大意:在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用 ...