感知器

  • 感知器是一种人工神经网络,其模拟生物上的神经元结构
  • 感知器是一个二分类器,其将净输入为:
    z=WTX=w0+w1x1+w2x2+⋯+wnxnz=W^{T}X=w^{0}+w^{1}x^{1}+w^{2}x^{2}+\cdots+w^{n}x^{n}z=WTX=w0+w1x1+w2x2+⋯+wnxn

    • 通过激活函数φ(z)\varphi(z)φ(z),就可以将其映射为1或-1
    • φ(z)={1z≥θ−1z<θ\varphi(z)=\begin{cases} 1 & z\geq \theta \\ -1 & z<\theta \end{cases}φ(z)={1−1​z≥θz<θ​
    • 其中θ\thetaθ是我们指定的一个值
import numpy as np
import pandas as pd
#还是使用鸢尾花数据集
data=pd.read_csv(r"F:\数据集\Iris数据集\iris.csv")
#删除“Unnamed: 0”列
data.drop("Unnamed: 0",axis=1,inplace=True)
#删除重复的记录
data.drop_duplicates(inplace=True)
#data["Species"].value_counts()
#分类别映射  之所以映射为1和-1而非之前的0 1 2 ,是因为感知器的预测结果为1和-1
#目的是为了与感知器的预测结果相符
data["Species"]=data["Species"].map({"versicolor":0,"virginica":1,"setosa ":-1})
#筛选预测结果为1和-1的数据
data=data[data["Species"]!=0]
len(data)
99

编写感知器类

class Perception:"""使用python语言实现感知器算法,实现二分类"""def __init__(self,alpha,times):"""初始化方法:Parameters:-------------alpha:float学习率times:int最大迭代次数"""self.alpha=alphaself.times=timesdef step(self,z):"""阶跃函数Paraneters:-------------------z:数组类型。(或者是标量类型)阶跃函数的参数,可以跟据z值,返回1或-1(这样可以实现二分类)Return:-------------value:int如果z>=0,返回1,否则返回-1"""#return 1 if z>=0 else -1  这是python写法,但只能用于标量,所以下面的更通用些#不论z是标量还是数组都行return np.where(z>=0 ,1,-1)def fit(self,X,y):"""根据提供的训练数据,对模型进行训练Parameters-------------X:类数组类型。形状:[样本数量,特征数量]待训练的样本数据。y:类数组类型。形状:[样本数量]每个样本的目标值。(分类)"""X=np.asarray(X)y=np.asarray(y)#创建权重的向量,初始值为0,长度比特征多1,(多出的一个就是截距)self.w_=np.zeros(1+X.shape[1])#创建损失列表,用来保存每次迭代后的损失值self.loss_=[]#循环指定的次数for i in range(self.times):#感知器与逻辑回归的区别:逻辑回归中使用所有样本计算梯度,然后更新权重#而感知器中,是使用单个样本,依次进行计算梯度,更新权重loss=0for x,target in zip(X,y):#计算预测值  x是矩阵X 中的一行y_hat=self.step(np.dot(x,self.w_[1:])+self.w_[0])#若预测值不等于真实值,loss加1loss+=y_hat!=target#更新权重  更新公式:w(j)=w(j)+学习率*(真实值-预测值)*x(j)self.w_[0]+=self.alpha*(target-y_hat)self.w_[1:]+=self.alpha*(target-y_hat)*x#将循环中增加的误差值增加到误差列表中self.loss_.append(loss)def predict(self,X):"""根据参数传递的样本,对样本数据进行预测。(1或-1)Parameters:--------------X:类数组类型,形状为:[样本数量,特征数量]待预测的样本特征。Returns:---------------result:数组类型预测的结果值(分类值1或-1)"""return self.step(np.dot(X,self.w_[1:])+self.w_[0])

测试与可视化

#分离出两个类别的数据
t1=data[data["Species"]==1]
t2=data[data["Species"]==-1]
#对两类数据进行洗牌
t1=t1.sample(len(t1),random_state=0)
t2=t2.sample(len(t2),random_state=0)
#构建训练集和测试集
train_X=pd.concat([t1.iloc[:40,:-1],t2.iloc[:40,:-1]],axis=0)
train_y=pd.concat([t1.iloc[:40,-1],t2.iloc[:40,-1]],axis=0)
test_X=pd.concat([t1.iloc[40:,:-1],t2.iloc[40:,:-1]],axis=0)
test_y=pd.concat([t1.iloc[40:,-1],t2.iloc[40:,-1]],axis=0)
p=Perception(0.1,10)
p.fit(train_X,train_y)
result=p.predict(test_X)
display(result)
display(test_y.values)
display(p.w_)
display(p.loss_)
array([1, 1, 1, 1, 1, 1, 1, 1, 1])array([1., 1., 1., 1., 1., 1., 1., 1., 1.])array([0., 0., 0., 0., 0.])[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"]="SimHei"
mpl.rcParams["axes.unicode_minus"]=False
#绘制真实值
plt.plot(test_y.values,"go",ms=15,label="真实值")
#绘制预测值
plt.plot(result,"rx",ms=15,label="预测值")
plt.title("感知器-二分类")
plt.xlabel("样本序号")
plt.ylabel("类别")
plt.legend()
plt.show()

#绘制目标函数损失值
plt.plot(range(1,p.times+1),p.loss_,"o-")
[<matplotlib.lines.Line2D at 0x4c13bb7c08>]


感知机算法python实现相关推荐

  1. python 机器学习——从感知机算法到各种最优化方法的应用(python)

    一 准备 1 数据集 2 基本工具 21 pandasread in data 22 numpyprocess data 23 matplotlibvisualize data 二 基本概念与定义 三 ...

  2. 感知机算法之Python代码实现

    感知机算法之Python代码实现 1.算法简介 感知机学习算法原始形式: 输入:训练集T 输出:w,b 感知机模型:f(x)=sign(w·x+b) 算法步骤: 1.初始化参数w0,b0 2.在训练集 ...

  3. 感知机算法在鸢尾花数据集上的实践

    感知机算法在鸢尾花数据集上的实践 1 问题背景 2 数据集的微处理 3 导数据,并进行简单可视化 4 模型算法的训练部分 1 问题背景 感知机作为一个比较经典的处理线性二分类的算法,今天想着实践一下, ...

  4. 感知机算法的两种表示

    感知机算法的原始形式 输入:训练数据集T={(x1,y1),(x2,y2),...,(xn,yn)},其中xi属于Rn(n维空间向量),yi={-1,+1},i=1,2,...,N 学习率t(0< ...

  5. 棋盘最短路径 python_Dijkstra 最短路径算法 Python 实现

    Dijkstra 最短路径算法 Python 实现 问题描述 使用 Dijkstra 算法求图中的任意顶点到其它顶点的最短路径(求出需要经过那些点以及最短距离). 以下图为例: 算法思想 可以使用二维 ...

  6. 2021-03-15 数据挖掘算法—K-Means算法 Python版本

    数据挖掘算法-K-Means算法 Python版本 简介 又叫K-均值算法,是非监督学习中的聚类算法. 基本思想 k-means算法比较简单.在k-means算法中,用cluster来表示簇:容易证明 ...

  7. 2021-01-28 粒子群优化算法-Python版本和Matlab函数 particleswarm 调用

    粒子群优化算法-Python版本和Matlab函数 particleswarm 调用 前两天分享了粒子群优化算法的原理和Matlab原理实现,本文分享一下Python代码下的PSO实现以及Matlab ...

  8. 最优化算法python实现篇(4)——无约束多维极值(梯度下降法)

    最优化算法python实现篇(4)--无约束多维极值(梯度下降法) 摘要 算法简介 注意事项 算法适用性 python实现 实例运行结果 算法过程可视化 摘要 本文介绍了多维无约束极值优化算法中的梯度 ...

  9. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)

    最优化算法python实现篇(3)--无约束一维极值(黄金分割法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 ...

最新文章

  1. 用jsp实现右导航窗格_不想升级操作系统,可以用这三种方法阻止Windows10更新
  2. 施一公:大学必须不计成败、不论得失地为探索者提供宽容和支持的环境
  3. mysql对哪些字符敏感_MySQL对大小写敏感一些总结
  4. RuntimeError: Error occured during execution of the processing block! See the log for more info
  5. centos7安装ddos-deflate
  6. 手机游戏美术外包的四大优点及三大建议
  7. 不使用加减乘除符号计算加法
  8. android通过c调用shmat函数,编译可在Android上运行的qemu user mode
  9. nginx配置ssl
  10. 训练(training)和推理\推断(inference)的关系?
  11. sysadmin默认密码_Sysadmin工具,Kconfig / kbuild的秘密,11个KDE应用程序,tcpdump,Laverna,Python等
  12. as3数据类型检查写法(is/as/typeof/in/instanceof)用法介绍
  13. python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上
  14. linux:如何修改用户的密码
  15. NetBPM的nPdl的第一遍翻译
  16. 康奈尔笔记法(5R笔记法)
  17. 我见过的最糟糕代码,看了都说好!
  18. 几款漂亮的Eclipse编辑器皮肤
  19. VM启动centos出现Assuming drive cache: write through.../run/initramfs/rdsosreport.txt类似错误解决方案
  20. 三、C++反作弊对抗实战 (实战篇 —— 3.如何获取游戏中角色人物角色的名称坐标、血量、武器信息(非CE扫描))

热门文章

  1. linux下面的智能解压脚本smart解压
  2. UIAlertController (UIActionSheet, UIAlertView is deprecated in iOS 8.)
  3. BZOJ1345 [Baltic2007]序列问题Sequence
  4. Extreme Programming
  5. css框模型、定位、浮动
  6. IDEA破解(破解补丁)
  7. Instance2:login interface
  8. Bitmap简单使用及简单解析
  9. swift:自定义UICollectionViewFlowLayout
  10. ORA-28056:Writing audit records to Windows EventLog failed的问题