感知机(perceptron)代码实现

2023-11-19

(书面内容参考《统计学习方法》李航)

感知机(perceptron)是二分类的线性模型,旨在求出将训练数据进行线性划分的分离超平面。

感知机模型:

        假设输入空间(特征空间)是x⊆Rn,输出空间是y=\left \{ -1,+1\right \}输入x∊x表示实例的特征向量,对应于输入空间(特征空间)的点;输出y∊y表示实例的类别。

由输入空间到输出空间的如下函数:

f(x) = sign\left ( w\cdot x+b \right )

称为感知机。

其中,w和b为感知机模型参数,w∊Rn叫作权值(weight)或权值向量(weight vector),b∊R叫作偏置(bias),w·x表示w和x的内积。

sign是符号函数,即

sign\left ( x \right ) = \left\{ \begin{aligned} +1 & , & x\geqslant 0 \\ -1 & , & x< 0 \\ \end{aligned} \right.

感知机是一种线性分类模型,属于判别模型。

感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数集合\left \{ f|f(x) = w\cdot x+b \right \}

感知机有如下几何解释:线性方程w\cdot x+b = 0

对应于特征空间Rn中的一个超平面S,其中w是超平面的法向量,b是超平面的截距。

这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。

因此,超平面S称为分离超平面(separating hyperplane)

 

  

(图片来自《统计学习方法》) 

代码实现:

# -*- coding: UTF-8 -*-

# 导入iris数据集
from sklearn.datasets import load_iris
# 导入数据划分包
from sklearn.model_selection import train_test_split
# 导入感知机模型包
from sklearn.linear_model import Perceptron
# 导入基本函数库
import matplotlib.pyplot as plt 
import pandas as pd
import numpy as np

# 定义样本数量
global Sample_num 
Sample_num = 100

iris = load_iris()

## 取出iris的标签
iris_target = iris.target

iris_features = pd.DataFrame(iris.data, columns=iris.feature_names)
## 将标签并入数组
iris_features['target'] = iris_target
iris_features.columns=['sepal length', 'sepal width', 'petal length', 'petal width', 'label']

# 取出样本集,使用前两个特征
x = np.array(iris_features.iloc[:Sample_num,0:2])
y = iris_target[:Sample_num]

# 切分数据集,70%训练集,30%测试集
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size = 0.3)

# 定义感知机
pla = Perceptron(
    fit_intercept=False, # 不计算偏置
    shuffle = False # 在每个epoch重新打乱洗牌
)
# 模型训练
pla.fit(x_train,y_train)
# 输出权重和偏差
w = pla.coef_
b = pla.intercept_
print(f"权重(w) = {w}\n偏差(b) = {b}")

# 模型测试
result = pla.score(x_test,y_test)
print(f"测试结果准确率为:{result}")

#—————————————————————————— 画图——————————————————————————————
# 分开正例反例
# 正例横坐标
positive_x = [x[i,0] for i in range(Sample_num) if y[i] == 1]
# 正例纵坐标
positive_y = [x[i,1] for i in range(Sample_num) if y[i] == 1]
# 反例横坐标
negetive_x = [x[i,0] for i in range(Sample_num) if y[i] == 0]
# 反例纵坐标
negetive_y = [x[i,1] for i in range(Sample_num) if y[i] == 0]

# 画出散点图
plt.scatter(positive_x,positive_y,c='r')
plt.scatter(negetive_x,negetive_y,c='b')

# 画出超平面
line_x = np.arange(4,8)
# w[0][0]x+w[0][1]y+b=0 => 斜率:-w[0][0]/w[0][1]) 截距:-b/w[0][1]
line_y = line_x*(-w[0][0]/w[0][1])-b/w[0][1]
plt.plot(line_x,line_y)
plt.show()

结果:  

 

权重(w) = [[ 20.  -36.9]]
偏差(b) = [0.]
测试结果准确率为:0.9666666666666667

 

权重(w) = [[  7.9 -13.2]]
偏差(b) = [0.]
测试结果准确率为:0.9666666666666667

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

感知机(perceptron)代码实现 的相关文章

随机推荐

  • visio 科学图形包_Gnuplot科学绘图(三十九)——地图及圆圈数据图

    Gnuplot科学绘图 系列内容Gnuplot科学绘图 三十一 曲线色彩填充 Gnuplot科学绘图 三十二 填充风格Gnuplot科学绘图 三十三 柱状图Gnuplot科学绘图 三十四 阶梯图Gnuplot科学绘图 三十五 数据平滑Gnu
  • element-ui中日期区间组件

    elementui中日期组件使用 最长只能选择3个月 不限制禁用日期 描述 时间组件代码 描述 点击 确定 按钮进行验证 点击 清空 按钮 清空输入框中的数据 时间范围不能超过3个月 并添加快捷选择今天 最近一周 最近一月 最近3个月 以下
  • js正则 年龄只能为正数,不能为负数,且不能超过150

    需求 要对输入的年龄加条件限制 不能任意输入 只能为正数 不能输入小数 负数
  • 正则表达式(日期、金额、特殊字符)_java语言

    正则表达式 java 正则表达式在线测试网站 个人觉得还算精确 http tool chinaz com regex 备注 如有错误 希望留言指出 虚心请教 金额格式 正数 包含至多2位小数 第1种形式 校验金额格式是否正确 正数 包含至多
  • Android OpenCv 提取图像的RGB三原色分割图像Split Core.split

    基础知识 如果你还不了解 图片 是如何存储的 建议先去看这篇文章 关于三通道彩色图像的存储方式理解 函数简析 我们都知道 彩色图片每个像素点都对应三个值 如 R G B Core split 这个函数则是帮我们这三个值分开 即分别提取 R
  • VUE3快速上手--知识点

    本文是根据B站尚硅谷的视频 尚硅谷Vue2 0 Vue3 0全套教程 全网最新最强vuejs从入门到精通 Vue3部分形成的笔记 一 简介 2020年9月18日 Vue js发布3 0版本 代号 One Piece 海贼王 Vue3相比Vu
  • fileinclude (攻防世界web)

    题目 从题目页面可得到对我们有用的信息 flag存放在了flag php中 并且还知道了当前页面的绝对路径 分析完当前页面能够获取到的所有信息后 查看页面源代码试试 发现得到了主页的php源码 分析以上源码 可知其中 lan为我们可控的 并
  • CentOS安装mariadb

    1 安装 root localhost yum install mariadb mariadb server 2 启动并自启 root ecs 3f21 systemctl enable mariadb now 3 查看启动状态 root
  • CLIP 改进工作

    Contents 图像分类 IJCV 2022 Learning to prompt for vision language models Introduction Context Optimization CoOp Experiments
  • Quartz定时任务详解

    一 添加依赖
  • android Instrumentation

    Android提供了一系列强大的测试工具 它针对Android的环境 扩展了业内标准的JUnit测试框架 尽管你可以使用JUnit测试Android工程 但Android工具允许你为应用程序的各个方面进行更为复杂的测试 包括单元层面及框架层
  • VUE中用原生JS实现触底加载数据

    VUE中用原生JS实现触底加载数据 在vue开发过程中使用第三方组件是不可避免的 但是第三方样式的css样式属实头痛 所以我选择原生JS的写法完成了触底加载 1 定义data page 1 页数 limit 10 每页数据条数 flag t
  • 单项选择题标准化考试系统

    单项选择题标准化考试系统 学校将大一上学期期末的c语言课程设计放进下学期开学 我选取的c课程设计题目是 单项选择题标准化考试系统 参考了csdn一些大佬的文章 终于做出来了 接下来 我将与大家一起浏览该系统 系统还有很多不足之处 欢迎提建议
  • 向顺序表插入新元素且不破坏其顺序性的高效率算法

    向顺序表L插入新元素x时可以由最后一个元素开始遍历 在遍历的同时进行移位赋值操作 如当遍历到的元素L elem i 比x大时 将L elem i 后移在下个元素的位置 而其所在位置则由x占有 当遍历到的元素L elem i 比x小时 则跳出
  • VS 2008配置Winpcap环境

    写在前面的话 这篇博客主要是写给小白看的 因为自己也是一个小白 之前从没有接触过网络嗅探器这些东西 如果说基础的话就是学习过计算机网络 对于计算机网络有一点点了解 再就是对于编程语言基础语法还算熟悉吧 这学期选修了网络攻击与防范这门课程 老
  • 视觉SLAM14讲笔记-第7讲-视觉里程计1

    图像特征点 特征点由关键点和描述子两部分组成 我们说的特征点具有旋转不变性 都是指的是特征点的描述子具有旋转不变性 而描述子指的是一个点周围的特征 一般由一个向量组成 描述一个点附近的特征 比如45度方向是亮的 135度方向是暗的等 比较著
  • 【WIN】【C++】查询文件信息(公司、版本、版权、描述、厂商等)

    使用C 提供的一个查询文件信息的接口 实现接口为 QueryValue fileInfo h class FileInfoUtils public static bool GetFileDescription const std wstri
  • mysql 免安装重装_mysql 卸载 重装 免安装版

    今天下午一下午都在安装mysql 首先说 卸载 1 如果控制面板里有mysql sever 先卸载 2 把安装的文件都删掉 3 regedit exe注册表中的三个地方的MySQl文件夹删掉 在cmd中输入regedit就找到注册表了 4
  • linux下C语言中的flock函数用法

    http blog csdn net lin fs article details 7804494 表头文件 include
  • 感知机(perceptron)代码实现

    书面内容参考 统计学习方法 李航 感知机 perceptron 是二分类的线性模型 旨在求出将训练数据进行线性划分的分离超平面 感知机模型 假设输入空间 特征空间 是x Rn 输出空间是输入x x表示实例的特征向量 对应于输入空间 特征空间