基于双月数据集单层感知机_python
- 前言
- 一、单层感知机
- 二、双月数据集
- 三、程序
- 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.生成数据集 class moon_data_class(object):def __init__(self,N,d,r,w):self.N=Nself.w=wself.d=dself.r=rdef ...
- Python实现支持向量机(基于双月数据集)
1.生成数据集 class moon_data_class(object):def __init__(self,N,d,r,w):self.N=Nself.w=wself.d=dself.r=rdef ...
- Python实现多层感知器MLP(基于双月数据集)
1.加载必要的库,生成数据集 import math import random import matplotlib.pyplot as plt import numpy as np class mo ...
- 基于双月数据集利用最小二乘法进行分类
1.加载数据集 import numpy as np import matplotlib.pyplot as pltclass moon_data_class(object):def __init__ ...
- 最小均方算法二分类(基于双月数据集)
1.生成数据集 import numpy as np import matplotlib.pyplot as pltclass moon_data_class(object):def __init__ ...
- 初探神经网络(二)单层感知机的Rosenblatt算法原理
本期大量干货,配合线性代数和较扎实的统计知识食用更佳. 介绍过了M-P模型,也了解到了M-P模型本质上是对生物上神经元的抽象模型.在上一章,我反复在强调这只是一个生物学的概念,我相信看到这篇文章的人绝 ...
- 用Python实现单层感知机
单层感知机的原理 感知机是一种二分类的线性分类模型,一个训练好的感知机会将输入的特征向量转化成+1和-1两类.在训练过程(将一个目标函数最小化)中,会根据输入特征学习到一个超平面,这个超平面由两个参数 ...
- TensorFlow单层感知机实现
TensorFlow单层感知机实现 简单感知机是一个单层神经网络.它使用阈值激活函数,正如 Marvin Minsky 在论文中所证明的,只能解决线性可分的问题.虽然限制了单层感知机只能应用于线性可分 ...
- R语言explore包进行探索性数据分析实战(EDA、exploratory data analysis):基于iris数据集
R语言explore包进行探索性数据分析实战(EDA.exploratory data analysis):基于iris数据集 目录
最新文章
- checkbox选中和不选中_我的lt;input /gt;不可能这么可爱
- 华为手机 android8.0APP更新时出现安装包解析异常的提示及安装闪退(无反应)问题
- python新手遇到的5大坑
- Python如何使用不同分隔符切分字符串
- 神策数据荣获“金猿奖 - 2017 金融科技优秀产品奖”
- wxWidgets:wxMediaEvent类用法
- IdentityServer4-前后端分离之Vue
- 椭圆形中间一个大写的v_静安区椭圆形桥梁空心板橡胶气囊,方形桥梁板橡胶气囊_冠桥橡胶...
- 消息中间件 rabbitMQ
- php中左右去电空格,PHP中ltrim与rtrim去除左右空格及特殊字符实例
- Log4j具体使用实例
- c++ 编译添加dll_通达信DLL编程(三)
- Brother DCP-1608 Printer共享打印机防坑指南
- arcgis 只能查看指定行政区域_[教程】Arcgis进阶:统计分析
- 微信小程序开发实战(9):单行输入和多行输入组件
- 搜一下导航完整程序源码
- python读取只读word只读_10.9 只读数据库(Read-only Database)
- SRAM的性能及结构
- 前端实现base64格式文件的下载
- [Ubuntu18.04遇到的问题及解决办法]缺失字体如何手动添加字体
热门文章
- 拉取并且mongo保存聚宽的期货分钟线数据
- Python numpy.abs和abs函数别再傻傻分不清了
- 前端项目:从0开始实现一个合成大西瓜
- “wait_for“: 不是 “winrt::impl“ 的成员
- 不积小流,无以成江海;不积跬步,无以至千里
- Matlab RGB 颜色对照表(0-1之间取值)
- 【Lesson 1】 和弦 Chord
- 学计算机的考研254分,2011年考研:历史学专业课254分经验谈
- SDN网络的本质特点
- fastdfs连接mysql_使用fastdfs-zyc监控FastDFS文件系统