• 前言
  • 一、单层感知机
  • 二、双月数据集
  • 三、程序
    • 1.引入库
    • 2.主函数
  • 总结
  • 完整程序

前言

本文主要针对双月数据集实现二分类问题。


一、单层感知机

单层感知机目标是将被感知数据集划分为两类的分离超平面,并计算出该超平面。单层感知机是二分类的线性分类模型,输入是被感知数据集的特征向量,输出时数据集的类别{+1,-1}。感知器的模型可以简单表示为:

该函数称为单层感知机,其中w是网络的N维权重向量,b是网络的N维偏置向量, w.x是w和x的内积,w和b的N维向量取值要求在实数域。

本文是将感知机模型简化,将权值b合并到w里进行更新,简化了计算。

sign函数是感知机的早期激活函数,后面又演化出一系列的激活函数。激活函数一般采用非线性激活函数,以增强网络的表达能力。常见的激活函数有:sign, sigmoid,tanh,ReLU等。

二、双月数据集

根据圆的参数方程,设置圆的角度与双月宽度两个随机参数生成双月数据点集。
初始值为:
N = 1000 # 单个月亮数据集数据量
w = 2
r = 8
d = 1
iter = 50 # 迭代次数
learning_rate = 0.001 # 学习率
wn = np.array([1,0,0])

def moon(N,w,r,d):'''# :param w: 半月宽度# :param r: x轴偏移量# :param d: y轴偏移量# :param N: 半月散点数量:return: data (2*N*3) 月亮数据集data_dn (2*N*1) 标签'''data = np.ones((2*N,4))# 半月1的初始化r1 = 10  # 半月1的半径,圆心w1 = np.random.uniform(-w / 2, w / 2, size=N)  # 半月1的宽度范围theta1 = np.random.uniform(0, np.pi, size=N)  # 半月1的角度范围x1 = (r1 + w1) * np.cos(theta1)  # 行向量y1 = (r1 + w1) * np.sin(theta1)label1 = [1 for i in range(1,N+1)]  # label for Class 1# 半月2的初始化r2 = 10  # 半月1的半径,圆心w2 = np.random.uniform(-w / 2, w / 2, size=N)  # 半月1的宽度范围theta2 = np.random.uniform(np.pi, 2 * np.pi, size=N)  # 半月1的角度范围x2 = (r2 + w2) * np.cos(theta2) + ry2 = (r2 + w2) * np.sin(theta2) - dlabel2 = [-1 for i in range(1,N+1)]  # label for Class 2data[:,1] = np.concatenate([x1, x2])data[:,2] = np.concatenate([y1, y2])data[:,3] = np.concatenate([label1, label2])return data

三、程序

1.引入库

import numpy as np
import matplotlib.pyplot as plt# from sklearn.cross_validation import train_test_split #用于分割数据。
from sklearn.model_selection import train_test_split# ##################### 添加图片文字 ###########################################
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimSun']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
# ############################################################################

2.主函数

if __name__ == '__main__':# 初始化参数N = 1000    # 单个月亮数据集数据量w = 2r = 8d = 1iter = 50   # 迭代次数learning_rate = 0.001   # 学习率wn = np.array([1,0,0])data = moon(N,w,r,d)'''随机采用20%的数据用于测试,剩下的80%用于构建训练集合'''data_train,data_test,dn_train,dn_test=train_test_split(data[:,1:3],data[:,3],test_size=0.20,random_state=None)'''训练数据调整'''train_data = np.ones((1600,3))train_data[:,1:3] = data_traintrain_dn = dn_train'''迭代 训练 寻找最优解wn'''loss,wn = train(train_data,train_dn,wn,iter,learning_rate)print(wn)   # 最优解wn'''测试数据调整'''test_data = np.ones((400,3))test_data[:,1:3] = data_testtest_dn = dn_test'''测试'''err,acc = test(test_data,test_dn)print('测试结果 错误率:','%.2f'%err)print('测试结果 正确率:','%.2f'%acc)'''决策平面 y+wx+b=0'''x = np.array(range(-15,25))y = -x*wn[1]/wn[2]-wn[0]/wn[2]'''月亮数据集'''plt.figure()plt.title('月亮数据集', size=14)plt.xlabel('x 轴', size=14)plt.ylabel('y 轴', size=14)plt.grid(ls=':', color='gray', alpha=0.5)  # alpha是透明度plt.scatter(data[0:N,1],data[0:N,2],c='b',s=20,marker='+')plt.scatter(data[N:2*N,1],data[N:2*N,2],c='r',s=20,marker='+')plt.plot(x,y,'k--')plt.savefig('./月亮数据集.png')'''损失函数'''x = [i for i in range(len(loss))]plt.figure()plt.title('损失函数曲线图', size=14)plt.xlabel('迭代次数', size=14)plt.ylabel('均方误差', size=14)# plt.grid(ls=':', color='gray', alpha=0.5)  # alpha是透明度plt.plot(x,loss,c='r',linewidth=2,linestyle='-',marker='o')plt.savefig('./损失函数.png')plt.show()

总结

从N=1000*2个点中随机选取80%的点作为训练集,20%的点作为测试集。迭代50次后,返回最优值wn,测试结果的错误率与正确率:
[ 0.656 -0.01167188 0.66452531]
测试结果 错误率: 0.00
测试结果 正确率: 1.00

画出决策平面与损失函数,如图:

完整程序

https://download.csdn.net/download/weixin_43816216/62520810

基于双月数据集单层感知机_python相关推荐

  1. 基于双月数据集利用感知层进行分类

    1.生成数据集 class moon_data_class(object):def __init__(self,N,d,r,w):self.N=Nself.w=wself.d=dself.r=rdef ...

  2. Python实现支持向量机(基于双月数据集)

    1.生成数据集 class moon_data_class(object):def __init__(self,N,d,r,w):self.N=Nself.w=wself.d=dself.r=rdef ...

  3. Python实现多层感知器MLP(基于双月数据集)

    1.加载必要的库,生成数据集 import math import random import matplotlib.pyplot as plt import numpy as np class mo ...

  4. 基于双月数据集利用最小二乘法进行分类

    1.加载数据集 import numpy as np import matplotlib.pyplot as pltclass moon_data_class(object):def __init__ ...

  5. 最小均方算法二分类(基于双月数据集)

    1.生成数据集 import numpy as np import matplotlib.pyplot as pltclass moon_data_class(object):def __init__ ...

  6. 初探神经网络(二)单层感知机的Rosenblatt算法原理

    本期大量干货,配合线性代数和较扎实的统计知识食用更佳. 介绍过了M-P模型,也了解到了M-P模型本质上是对生物上神经元的抽象模型.在上一章,我反复在强调这只是一个生物学的概念,我相信看到这篇文章的人绝 ...

  7. 用Python实现单层感知机

    单层感知机的原理 感知机是一种二分类的线性分类模型,一个训练好的感知机会将输入的特征向量转化成+1和-1两类.在训练过程(将一个目标函数最小化)中,会根据输入特征学习到一个超平面,这个超平面由两个参数 ...

  8. TensorFlow单层感知机实现

    TensorFlow单层感知机实现 简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,只能解决线性可分的问题.虽然限制了单层感知机只能应用于线性可分 ...

  9. R语言explore包进行探索性数据分析实战(EDA、exploratory data analysis):基于iris数据集

    R语言explore包进行探索性数据分析实战(EDA.exploratory data analysis):基于iris数据集 目录

最新文章

  1. checkbox选中和不选中_我的lt;input /gt;不可能这么可爱
  2. 华为手机 android8.0APP更新时出现安装包解析异常的提示及安装闪退(无反应)问题
  3. python新手遇到的5大坑
  4. Python如何使用不同分隔符切分字符串
  5. 神策数据荣获“金猿奖 - 2017 金融科技优秀产品奖”
  6. wxWidgets:wxMediaEvent类用法
  7. IdentityServer4-前后端分离之Vue
  8. 椭圆形中间一个大写的v_静安区椭圆形桥梁空心板橡胶气囊,方形桥梁板橡胶气囊_冠桥橡胶...
  9. 消息中间件 rabbitMQ
  10. php中左右去电空格,PHP中ltrim与rtrim去除左右空格及特殊字符实例
  11. Log4j具体使用实例
  12. c++ 编译添加dll_通达信DLL编程(三)
  13. Brother DCP-1608 Printer共享打印机防坑指南
  14. arcgis 只能查看指定行政区域_[教程】Arcgis进阶:统计分析
  15. 微信小程序开发实战(9):单行输入和多行输入组件
  16. 搜一下导航完整程序源码
  17. python读取只读word只读_10.9 只读数据库(Read-only Database)
  18. SRAM的性能及结构
  19. 前端实现base64格式文件的下载
  20. [Ubuntu18.04遇到的问题及解决办法]缺失字体如何手动添加字体

热门文章

  1. 拉取并且mongo保存聚宽的期货分钟线数据
  2. Python numpy.abs和abs函数别再傻傻分不清了
  3. 前端项目:从0开始实现一个合成大西瓜
  4. “wait_for“: 不是 “winrt::impl“ 的成员
  5. 不积小流,无以成江海;不积跬步,无以至千里
  6. Matlab RGB 颜色对照表(0-1之间取值)
  7. 【Lesson 1】 和弦 Chord
  8. 学计算机的考研254分,2011年考研:历史学专业课254分经验谈
  9. SDN网络的本质特点
  10. fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统