import numpy as npfrom matplotlib import  pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.neural_network import MLPClassifierdef creat_data(n):'''创建线性可分数据集:param n: 正例样本的个数(同时也是负例样本的个数):return: 返回一个线性可分数据集,数据集大小为 2*n'''np.random.seed(1)x_11=np.random.randint(0,100,(n,1)) # 第一组:第一维坐标值x_12=np.random.randint(0,100,(n,1,))# 第一组:第二维坐标值x_13=20+np.random.randint(0,10,(n,1,))#第一组: 第三维坐标值x_21=np.random.randint(0,100,(n,1)) # 第二组:第一维坐标值x_22=np.random.randint(0,100,(n,1)) # 第二组:第二维坐标值x_23=10-np.random.randint(0,10,(n,1,)) # 第二组:第三维坐标值
new_x_12=x_12*np.sqrt(2)/2-x_13*np.sqrt(2)/2## 沿第一维轴旋转45度new_x_13=x_12*np.sqrt(2)/2+x_13*np.sqrt(2)/2## 沿第一维轴旋转45度new_x_22=x_22*np.sqrt(2)/2-x_23*np.sqrt(2)/2## 沿第一维轴旋转45度new_x_23=x_22*np.sqrt(2)/2+x_23*np.sqrt(2)/2## 沿第一维轴旋转45度
plus_samples=np.hstack([x_11,new_x_12,new_x_13,np.ones((n,1))]) # 拼接成正例数据集minus_samples=np.hstack([x_21,new_x_22,new_x_23,-np.ones((n,1))]) # 拼接成负例数据集samples=np.vstack([plus_samples,minus_samples]) # 拼接成完整数据集np.random.shuffle(samples)  # 混洗数据return samplesdef creat_data_no_linear(n):'''创建线性不可分数据集:param n: 正例样本的个数(同时也是负例样本的个数):return: 返回一个线性不可分数据集,数据集大小为 2*n'''np.random.seed(1)x_11=np.random.randint(0,100,(n,1))# 第一组:第一维坐标值x_12=np.random.randint(0,100,(n,1,))# 第一组:第二维坐标值x_13=10+np.random.randint(0,10,(n,1,))#第一组: 第三维坐标值x_21=np.random.randint(0,100,(n,1))# 第二组:第一维坐标值x_22=np.random.randint(0,100,(n,1))# 第二组:第二维坐标值x_23=20-np.random.randint(0,10,(n,1,)) # 第二组:第三维坐标值
new_x_12=x_12*np.sqrt(2)/2-x_13*np.sqrt(2)/2## 沿第一维轴旋转45度new_x_13=x_12*np.sqrt(2)/2+x_13*np.sqrt(2)/2## 沿第一维轴旋转45度new_x_22=x_22*np.sqrt(2)/2-x_23*np.sqrt(2)/2## 沿第一维轴旋转45度new_x_23=x_22*np.sqrt(2)/2+x_23*np.sqrt(2)/2## 沿第一维轴旋转45度
plus_samples=np.hstack([x_11,new_x_12,new_x_13,np.ones((n,1))])# 拼接成正例数据集minus_samples=np.hstack([x_21,new_x_22,new_x_23,-np.ones((n,1))])# 拼接成负例数据集samples=np.vstack([plus_samples,minus_samples])# 拼接成完整数据集np.random.shuffle(samples)  # 混洗数据return samplesdef plot_samples(ax,samples):'''绘制样本点:param ax: 绘制图形所在的 Axes:param samples: 样本数据集:return: None'''Y=samples[:,-1] # 标记信息position_p=Y==1 ## 正类位置position_m=Y==-1 ## 负类位置# 绘制正类样本点ax.scatter(samples[position_p,0],samples[position_p,1],samples[position_p,2],marker='+',label='+',color='b') # 绘制负类样本点ax.scatter(samples[position_m,0],samples[position_m,1],samples[position_m,2],marker='^',label='-',color='y') 

def run_plot_samples():'''绘制线性可分数据集:return: None'''fig=plt.figure()ax=Axes3D(fig)data=creat_data(100) # 产生线性可分数据集
    plot_samples(ax,data)ax.legend(loc='best')plt.show()run_plot_samples()

def run_plot_samples_no_linear():'''绘制线性不可分数据集:return: None'''data=creat_data_no_linear(100)# 产生线性不可分数据集fig=plt.figure()ax=Axes3D(fig)plot_samples(ax,data)ax.legend(loc='best')plt.show()run_plot_samples_no_linear()

def perceptron(train_data,eta,w_0,b_0):'''感知机的原始算法:param train_data: 训练数据集:param eta: 学习率:param w_0: 初始权重向量:param b_0: 初始的 b:return: 一个元组,依次为:最终的权重向量,最终的 b 值,迭代次数'''x=train_data[:,:-1]  # x 数据y=train_data[:,-1]  #  对应的标记length= train_data.shape[0] #样本集大小w=w_0b=b_0step_num=0while True:i=0while(i< length): ## 遍历一轮样本集中的所有的样本点step_num+=1'''当应用于线性不可分数据集时,用下面4行代替上面的 step_num+=1 这一行。如果不这么做,那么当用于线性不可分数据集时,迭代永远不会停止。step_num+=1if step_num>=10000000:print("failed!,step_num =%d"%step_num)return'''x_i=x[i].reshape((x.shape[1],1)) # 变成列向量,因为需要执行 np.dot 函数y_i=y[i]if y_i*(np.dot(np.transpose(w),x_i)+b) <=0: # 该点是误分类点w=w+eta*y_i*x_i  # 梯度下降b=b+eta*y_i      # 梯度下降break # 执行下一轮筛选else:#该点不是误分类点,选取下一个样本点i=i+1if(i== length): #没有误分类点,结束循环breakreturn (w,b,step_num)def creat_hyperplane(x,y,w,b):'''创建分离超平面:param x: 分离超平面上的点的x坐标组成的数组:param y: 分离超平面上的点的y坐标组成的数组:param w: 超平面的法向量,它是一个列向量:param b: 超平面的截距:return: 分离超平面上的点的z坐标组成的数组'''return (-w[0][0]*x-w[1][0]*y-b)/w[2][0] # w0*x+w1*y+w2*z+b=0

def run_perceptron():'''对线性可分数据集执行感知机的原始算法并绘制分离超平面'''data=creat_data(100) #产生线性可分数据集eta,w_0,b_0=0.1,np.ones((3,1),dtype=float),1 # 初始化 学习率、权重、 bw,b,num=perceptron(data,eta,w_0,b_0) # 执行感知机的原始形式### 绘图fig=plt.figure()plt.suptitle("perceptron")ax=Axes3D(fig)### 绘制样本点
    plot_samples(ax,data)##  绘制分离超平面x=np.linspace(-30,100,100)  # 分离超平面的 x坐标数组y=np.linspace(-30,100,100) # 分离超平面的 y坐标数组x,y=np.meshgrid(x,y) # 划分网格z=creat_hyperplane(x,y,w,b)  # 分离超平面的 z坐标数组ax.plot_surface(x, y, z, rstride=1, cstride=1,color='g',alpha=0.2)ax.legend(loc="best")plt.show()run_perceptron()

def perceptron_nolinear(train_data,eta,w_0,b_0):'''感知机的原始算法:param train_data: 训练数据集:param eta: 学习率:param w_0: 初始权重向量:param b_0: 初始的 b:return: 一个元组,依次为:最终的权重向量,最终的 b 值,迭代次数'''x=train_data[:,:-1]  # x 数据y=train_data[:,-1]  #  对应的标记length= train_data.shape[0] #样本集大小w=w_0b=b_0step_num=0while True:i=0while(i< length): ## 遍历一轮样本集中的所有的样本点step_num+=1if step_num>=10000000:print("failed!,step_num =%d"%step_num)returnx_i=x[i].reshape((x.shape[1],1)) # 变成列向量,因为需要执行 np.dot 函数y_i=y[i]if y_i*(np.dot(np.transpose(w),x_i)+b) <=0: # 该点是误分类点w=w+eta*y_i*x_i  # 梯度下降b=b+eta*y_i      # 梯度下降break # 执行下一轮筛选else:#该点不是误分类点,选取下一个样本点i=i+1if(i== length): #没有误分类点,结束循环breakreturn (w,b,step_num)def creat_hyperplane(x,y,w,b):'''创建分离超平面:param x: 分离超平面上的点的x坐标组成的数组:param y: 分离超平面上的点的y坐标组成的数组:param w: 超平面的法向量,它是一个列向量:param b: 超平面的截距:return: 分离超平面上的点的z坐标组成的数组'''return (-w[0][0]*x-w[1][0]*y-b)/w[2][0] # w0*x+w1*y+w2*z+b=0

def run_perceptron_no_linear():'''对线性不可分数据集执行感知机的元素算法'''data=creat_data_no_linear(100)#产生线性不可分数据集perceptron_nolinear(data,eta=0.1,w_0=np.zeros((3,1)),b_0=0)run_perceptron_no_linear()

def creat_w(train_data,alpha):'''根据训练数据集和 alpha向量 创建 权重向量:param train_data: 训练数据集:param alpha: alpha 向量:return: 权重向量'''x=train_data[:,:-1]  # x 数据y=train_data[:,-1]  #  对应的分类N= train_data.shape[0] #样本集大小w=np.zeros((x.shape[1],1))for i in range(0,N):w=w+alpha[i][0]*y[i]*(x[i].reshape(x[i].size,1))return w

def perceptron_dual(train_data,eta,alpha_0,b_0):'''感知机的对偶形式算法:param train_data: 训练数据集:param eta: 学习率:param alpha_0: 初始的 alpha 向量:param b_0: 初始的 b 值:return: 一个元组,依次为:最终的alpha 向量、最终的 b 值、迭代次数'''x=train_data[:,:-1]  # x 数据y=train_data[:,-1]  #  对应的分类length= train_data.shape[0] #样本集大小alpha=alpha_0b=b_0step_num=0while True:i=0while(i< length):step_num+=1x_i=x[i].reshape((x.shape[1],1)) # 变形为列向量,因为需要调用 np.doty_i=y[i]w=creat_w(train_data,alpha)z=y_i*(np.dot(np.transpose(w),x_i)+b)if z <=0: # 该点是误分类点alpha[i][0]+=eta  # 梯度下降b+=eta*y_i  # 梯度下降break # 梯度下降了,从头开始,执行下一轮筛选else:i=i+1 #该点不是误分类点,选取下一个样本点if(i== length ): #没有误分类点,结束循环breakreturn (alpha,b,step_num)def run_perceptron_dual():'''对线性可分数据集执行感知机的原始算法和对偶形式算法,并绘制分离超平面'''data=creat_data(100)eta,w_0,b_0=0.1,np.ones((3,1),dtype=float),1w_1,b_1,num_1=perceptron(data,eta,w_0,b_0) ##执行原始形式的算法alpha,b_2,num_2=perceptron_dual(data,eta=0.1,alpha_0=np.zeros((data.shape[0]*2,1)),b_0=0) # 执行对偶形式的算法w_2=creat_w(data,alpha)print("w_1,b_1",w_1,b_1)print("w_2,b_2",w_2,b_2)## 绘图fig=plt.figure()plt.suptitle("perceptron")ax=Axes3D(fig)### 绘制样本点
    plot_samples(ax,data)##  绘制分离超平面x=np.linspace(-30,100,100)  # 分离超平面的 x坐标数组y=np.linspace(-30,100,100) # 分离超平面的 y坐标数组x,y=np.meshgrid(x,y) # 划分网格z=creat_hyperplane(x,y,w_1,b_1)  # 原始形式算法的分离超平面的 z坐标数组z_2=creat_hyperplane(x,y,w_2,b_2)  # 对偶形式算法的分离超平面的 z坐标数组ax.plot_surface(x, y, z, rstride=1, cstride=1,color='g',alpha=0.2)ax.plot_surface(x, y, z_2, rstride=1, cstride=1,color='c',alpha=0.2)ax.legend(loc="best")plt.show()run_perceptron_dual()

def test_eta(data,ax,etas,w_0,alpha_0,b_0):'''测试学习率对于感知机两种形式算法的收敛速度的影响:param data:  训练数据集:param ax: Axes实例,负责绘制图形:param etas: 候选的学习率的值组成的列表:param w_0: 原始算法用到的初始权重向量:param alpha_0: 对偶形式用到的初始 alpha 向量:param b_0: 初始 b 值:return: None'''nums1=[]nums2=[]for eta in etas:_,_,num_1=perceptron(data,eta,w_0=w_0,b_0=b_0) # 获取原始形式算法的迭代次数_,_,num_2=perceptron_dual(data,eta=0.1,alpha_0=alpha_0,b_0=b_0) # 获取对偶形式算法的迭代次数
        nums1.append(num_1)nums2.append(num_2)ax.plot(etas,np.array(nums1),label='orignal iteraton times')ax.plot(etas,np.array(nums2),label='dual iteraton times')def run_test_eta():fig=plt.figure()fig.suptitle("perceptron")ax=fig.add_subplot(1,1,1)ax.set_xlabel(r'$\eta$')data=creat_data(20) # 创建线性可分数据集etas=np.linspace(0.01,1,num=25,endpoint=False)w_0,b_0,alpha_0=np.ones((3,1)),0,np.zeros((data.shape[0],1))test_eta(data,ax,etas,w_0,alpha_0,b_0)ax.legend(loc="best",framealpha=0.5)plt.show()run_test_eta()

转载于:https://www.cnblogs.com/tszr/p/10799579.html

吴裕雄 python 机器学习——人工神经网络与原始感知机模型相关推荐

  1. 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型

    import numpy as np import matplotlib.pyplot as pltfrom sklearn import datasets,naive_bayes from skle ...

  2. 吴裕雄 python 机器学习——数据预处理标准化StandardScaler模型

    from sklearn.preprocessing import StandardScaler#数据预处理标准化StandardScaler模型 def test_StandardScaler(): ...

  3. 吴裕雄 python 机器学习——数据预处理过滤式特征选取SelectPercentile模型

    from sklearn.feature_selection import SelectPercentile,f_classif#数据预处理过滤式特征选取SelectPercentile模型 def ...

  4. 机器学习——人工神经网络之BP算法编程(python二分类数据集:马疝病数据集)

    目录 一.理论知识回顾 1.神经网络模型 2.明确任务以及参数 1)待估参数: 2)超参数: 3)任务 3.神经网络数学模型定义 1)激活函数 ​ 2)各层权重.阈值定义 3)各层输入输出定义 4.优 ...

  5. 机器学习——人工神经网络之后向传播算法(BP算法)

    目录 一.后向传播算法的本质--梯度下降法求局部极值 1.w迭代公式的合理性 二.后向传播算法的推导(以二层神经网络为例) 1.问题描述(创建目标函数loss函数,求参数) 2.求解参数的流程(四步曲 ...

  6. 机器学习——人工神经网络之多层神经网络(多层与三层)

    目录 一.多层神经网络 1.多层神经网络数学模型 2.数学模型中的非线性函数fai 1)非线性函数fai存在的意义 2)非线性函数fai具体是什么? 3.多层神经网络与单层神经网络的区别与改进 1)单 ...

  7. 机器学习——人工神经网络之发展历史(神经元数学模型、感知器算法)

    目录 一.神经元的数学模型 ​ 二.感知器算法(SVM算法前身) 1.目的 2.流程 >>>问题1:下图w和b的调整是什么意思? 3.算法的有效性验证 1)原算法 2)增广矩阵 3) ...

  8. 吴恩达机器学习4——神经网络

    吴恩达机器学习4--神经网络 1. 非线性假设 2. 神经网络算法 2.1 神经元 2.2 神经网络 3. 神经网络算法实例 3.1 例子1:单层神经网络表示逻辑运算 3.2 例子2 4. 多分类 1 ...

  9. python大战机器学习——人工神经网络

    人工神经网络是有一系列简单的单元相互紧密联系构成的,每个单元有一定数量的实数输入和唯一的实数输出.神经网络的一个重要的用途就是接受和处理传感器产生的复杂的输入并进行自适应性的学习,是一种模式匹配算法, ...

最新文章

  1. Python join sorted sort map reduce 函数解析
  2. cwRsync 同步时报错 STATUS_ACCESS_VIOLATION
  3. Centos设置程序开机自启的方法
  4. 40款用于简洁网页设计的光滑英文字体【下】
  5. Linux基础知识(1)
  6. linux 运维高级脚本生成器,Linux运维系列,Shell高级脚本自动化编程实战
  7. C语言--关于指针两种初始化赋值操作
  8. 【Python】supervisor 工具介绍
  9. 经典:浅谈以太坊智能合约的设计模式与升级方法
  10. 基于DS3231实时时钟模块的stm32简易闹钟
  11. C语言程序设计编程题(六)15
  12. 面对众多云数据库,应该使用哪个云数据库好?
  13. ubuntu开机启动项
  14. 【Git】使用git上传代码到gitee
  15. 怎样与你的懒蛋同事相处?
  16. 2019校招硬件岗笔试题(乐鑫科技+比特大陆)
  17. 三菱Q系列PLC CCLink模块
  18. LCD1602的使用(51单片机)
  19. 【Django 开发】面试招聘信息网站(用户登录注册投在线递简历)
  20. 波音737MAX飞机坠机事件对嵌入式软件测试的启示

热门文章

  1. Java 使用 POI 对 Excel文件 进行读写操作
  2. 计算机输入输出接口是交接界面,计算机组成原理试题1
  3. mysql查询id为5的数据类型_MySql学习05---数据类型
  4. r中gglot怎么组合多张图_继电器组合扫盲篇
  5. 控制led闪烁次数_单片机驱动LED灯的进阶之路
  6. codeforces round #752
  7. [云计算]VXLAN的网关划分
  8. OpenCV之线性混合操作
  9. 唯一的确定一棵二叉树
  10. linux怎么加块硬盘,如何给linux添加一块硬盘