https://www.toutiao.com/a6687727778487337476/

利用sklearn.dataset随机产生数据,随机生成两类数据,用不同的颜色展示出来,如下图:

产生的随机代码如下:

#随机产生的数据
np.random.seed(0)
X,y=datasets.make_moons(300,noise=0.25)
plt.scatter(X[:,0],X[:,1],s=50,c=y,cmap=plt.cm.Vega20c,edgecolors="Black")
plt.title('Random data')
plt.show()

一、线性分类

先使用sklearn自带的线性分类方法,将上面的数据分为两类,代码和效果图如下:

from sklearn import linear_model
from sklearn import datasets
import sklearn
import numpy as np
import matplotlib.pyplot as plt
#绘制分类边界函数
def plot_boundary(pred_func,data,labels):x_min,x_max=data[:,0].min()-0.5,data[:,0].max()+0.5y_min,y_max=data[:,1].min()-0.5,data[:,1].max()+0.5h=0.01xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))z=pred_func(np.c_[xx.ravel(),yy.ravel()])z=z.reshape(xx.shape)plt.contourf(xx,yy,z,cmap=plt.cm.Blues,alpha=0.2)plt.scatter(data[:,0],data[:,1],s=40,c=labels,cmap=plt.cm.Vega20c,edgecolors="Black")plt.show()
#线性分类
logistic_fun=sklearn.linear_model.LogisticRegressionCV()
clf=logistic_fun.fit(X,y)
#展示分类图
plot_boundary(lambda x:clf.predict(x),X,y)
plt.title("Logistic Regression")

二、神经网络分类

定义如下图所示的神经网络:

网络结构:输入层、隐藏层、输出层【2,3,2】

激活函数使用Tanh函数,最后通过Softmax层把激活函数的输出转换为概率

对于分类问题,损失函数使用交叉熵损失,公式如下:

其中,p为期望概率分布(实际值),q为网络输出(预测值)

而为了避免过拟合,可添加L2正则化,新的损失函数即为:

关于反向传播与参数更新可参看这篇博客:https://www.cnblogs.com/wangyong/p/9740170.html

接下来,直接查看代码:

from sklearn import datasets
import sklearn
import numpy as np
import matplotlib.pyplot as plt
input_dim=2 #输入维度
output_dim=2 #输出的维度,分类数
epsilon=0.01 #梯度下降算法的学习率
reg_lambda=0.01
def calculate_loss(model,X,y):num_examples=len(X)W1,b1,W2,b2=model['W1'],model['b1'],model['W2'],model['b2']#正向传播计算预测值z1=X.dot(W1)+b1a1=np.tanh(z1)z2=a1.dot(W2)+b2#Softmax计算概率exp_scores=np.exp(z2)probs=exp_scores/np.sum(exp_scores,axis=1,keepdims=True)#交叉熵损失corect_logprobs=-np.log(probs[range(num_examples),y])data_loss=np.sum(corect_logprobs)#L2正则化data_loss+=reg_lambda/2*(np.sum(np.square(W1))+np.sum(np.square(W2)))return (1.0/num_examples)*data_loss
def predict(model,x):W1,b1,W2,b2=model['W1'],model['b1'],model['W2'],model['b2']#向前传播z1=x.dot(W1)+b1a1=np.tanh(z1)z2=a1.dot(W2)+b2exp_scores=np.exp(z2)probs=exp_scores/np.sum(exp_scores,axis=1,keepdims=True)return np.argmax(probs,axis=1)
def plot_boundary(pred_func,data,labels):x_min,x_max=data[:,0].min()-0.5,data[:,0].max()+0.5y_min,y_max=data[:,1].min()-0.5,data[:,1].max()+0.5h=0.01xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))z=pred_func(np.c_[xx.ravel(),yy.ravel()])z=z.reshape(xx.shape)plt.contourf(xx,yy,z,cmap=plt.cm.Blues,alpha=0.2)plt.scatter(data[:,0],data[:,1],s=40,c=labels,cmap=plt.cm.Vega20c,edgecolors="Black")plt.show()
def ANN_model(X,y,nn_dim):num_indim=len(X) #训练数据集model={}np.random.seed(0)W1=np.random.randn(input_dim,nn_dim)/np.sqrt(input_dim)b1=np.zeros((1,nn_dim))W2=np.random.randn(nn_dim,output_dim)/np.sqrt(nn_dim)b2=np.zeros((1,output_dim))#批量梯度下降算法BSGDnum_passes=20000 #梯度下降迭代次数for i in range(0,num_passes):#向前传播z1=X.dot(W1)+b1a1=np.tanh(z1)z2=a1.dot(W2)+b2exp_scores=np.exp(z2)probs=exp_scores/np.sum(exp_scores,axis=1,keepdims=True)#向后传播算法delta3=probsdelta3[range(num_indim),y] -= 1delta2=delta3.dot(W2.T)*(1-np.power(a1,2))dW2=(a1.T).dot(delta3)db2=np.sum(delta3,axis=0,keepdims=True)dW1=np.dot(X.T,delta2)db1=np.sum(delta2,axis=0)dW1 += reg_lambda * W1dW2 += reg_lambda * W2#更新权重W1 += -epsilon * dW1b1 += -epsilon * db1W2 += -epsilon * dW2b2 += -epsilon * db2model={'W1':W1,'b1':b1,'W2':W2,'b2':b2}if i%1000==0:print("Loss after iteration %i:%f",i,calculate_loss(model,X,y))return model
#随机产生的数据
np.random.seed(0)
X,y=datasets.make_moons(300,noise=0.25)
plt.scatter(X[:,0],X[:,1],s=50,c=y,cmap=plt.cm.Vega20c,edgecolors="Black")
plt.title('Medical data')
plt.show()
hidden_3_model=ANN_model(X,y,3)
plot_boundary(lambda x:predict(hidden_3_model,x),X,y)
plt.title("Hidden Layer size 3")

运行后的损失值和效果图如下图:

从上图可以看出线性分类与神经网络分类的区别,同时,神经网络的中间隐层的神经元节点数以及隐层的层数均会影响分类效果,可将隐层3个神经元换成其他数量进而查看分类效果。

深度学习原理—代码分析线性分类与神经网络分类的区别相关推荐

  1. 【深度学习原理第1篇】前馈神经网络,感知机,BP神经网络

    前馈神经网络(FNN) 前馈神经网路是一种单向多层的网络结构,信息从输入层开始,逐层向一个方向传递,即单向传递,一直到输出层结束.前馈的意思就是指传播方向指的是前向.前馈神经网络由三部分组成:输入层( ...

  2. 深度学习可解释性分析-Grad-CAM

    概念介绍 CAM揭示了卷积神经网络分类模型中图像的空间特征与其类别权重之间的联系,然鹅,CAM只适用于模型中有全局平均池化层并且只有一个全连接层(即输出层)的情形,如ResNet,MobileNet等 ...

  3. 深度学习 第3章线性分类 实验四 pytorch实现 Logistic回归 上篇

    目录: 第3章 线性分类 3.1 基于Logistic回归的二分类任务 3.1.1 数据集构建 3.1.2 模型构建 1. Logistic函数 2. Logistic回归算子 3.1.3 损失函数 ...

  4. 深度学习 第3章线性分类 实验四 pytorch实现 Softmax回归 鸢尾花分类任务 下篇

    目录: 第3章 线性分类 3.3 实践:基于Softmax回归完成鸢尾花分类任务 3.3.1 数据处理 3.3.1.1 数据集介绍 3.3.1.2 数据清洗 1. 缺失值分析 2. 异常值处理 3.3 ...

  5. 视频教程-深度学习原理详解及Python代码实现-深度学习

    深度学习原理详解及Python代码实现 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥88.0 ...

  6. 深度学习在情感分析中的应用

    然语言情感分析简介 情感分析无处不在,它是一种基于自然语言处理的分类技术.其主要解决的问题是给定一段话,判断这段话是正面的还是负面的.例如在亚马逊网站或者推特网站中,人们会发表评论,谈论某个商品.事件 ...

  7. 新闻上的文本分类:机器学习大乱斗 王岳王院长 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处

    新闻上的文本分类:机器学习大乱斗 王岳王院长 5 个月前 目标 从头开始实践中文短文本分类,记录一下实验流程与遇到的坑 运用多种机器学习(深度学习 + 传统机器学习)方法比较短文本分类处理过程与结果差 ...

  8. 深度学习笔记——情感分析

    很早之前就想写一篇关于用深度学习做情感分析的文章,一直拖到现在,拖延症啊.... 什么是情感分析? 情感分析(Sentiment analysis)是自然语言处理(NLP)领域的一个任务,又称倾向性分 ...

  9. 【案例实践】Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用

    查看原文>>>基于Python多元线性回归.机器学习.深度学习在近红外光谱分析中的实践应用 [专家]: 郁磊副教授 主要从事MATLAB 编程.机器学习与数据挖掘.数据可视化和软件开 ...

最新文章

  1. 连接LilyPad之Windows平台的驱动
  2. c 语言 循环队列,循环队列C语言
  3. [Oracle] 数据排重
  4. HDU 4535 吉哥系列故事——礼尚往来
  5. thinking-in-java(13) String字符串
  6. mysql客户端报错1366_mysql一些异常
  7. Codeforce 记录 Rating
  8. Luogu4936 Agent1
  9. linux 串口终端源码,LINUX 串口通讯源码
  10. Windows键盘上的截屏按键PrtSc
  11. Excel数据的快速填充
  12. coldfusion php,PHP加密代码转换为ColdFusion
  13. 如何成为一个区块链开发人员_关于成为远程开发人员的思考
  14. 金行健:市值缩水3000亿 中国中免过山车
  15. 看了他家的红木装修,彻底被圈粉了,庄重典雅又复古舒适
  16. mysql内嵌插入语句_MySQL中添加或插入语句(Insert)的几种使用方式
  17. 中文核心期刊目录(2004年版)
  18. 视频播放器播放flv报错Flv: Unsupported audio codec idx: 7
  19. java字符串用0X0F分割_微信公众帐号开发教程第4篇-----开发模式启用及接口配置Java...
  20. webstorm最新激活方法。绝对有效

热门文章

  1. pandas.core.frame.DataFrame是什么数据结构,为什么要如此取值  [ ]中嵌套[ ]
  2. oracle 里 符号 || 表示什么意思??
  3. 提到“子类”和“子类型”是不同的
  4. 北邮 JAVA教程 张海旸 讲义
  5. 工作报告总是写不好?表达不准确?试试这个写作方法
  6. 人人都有好工作:IT行业求职面试必读
  7. 《Flex 3程序设计》——Adobe技术专家力作
  8. Struts 2创始人Patrick Lightbody作序推荐
  9. 用TensorFlow实现的Mask R-CNN在人体语义分割上的效果
  10. Eclipase +PyDev(64位) 配置使用