干货!用 Python 快速构建神经网络
作者 | ZackSock
责编 | 欧阳姝黎
头图 | 下载于视觉中国
前言
机器学习一直是Python的一大热门方向,其中由神经网络算法衍生出来的深度学习在很多方面大放光彩。那神经网络到底是个个什么东西呢?
说到神经网络很容易让人们联想到生物学中的神经网络,而且很多时候也会把机器学习的神经网络和生物神经网络联系起来。但是其实人类至今都没有完全理解生物神经网络的运作,更不要谈用计算机实现生物神经网络了。
相比之下,机器学习中的神经网络更像是一个数学函数。我们输入一组数据,然后神经网络会给我们返回一个结果。像下面这个简单的函数:
和
我们给定一个x,就能得到一个y。只不过神经网络的函数要比上面的函数复杂得多。
不过其实神经网络的基础就是上面的函数。下面我们就带大家快速搭建一个神经网络。
机器学习
在学习神经网络之前,我们需要了解一些机器学习的知识。
2.1、什么是机器学习?
假如我有下面一组数据:
1, 3, 5, 7, 9
现在让你说出下一个数字可能是什么。
对于人类智慧来说,我们可以很快地说出11。但是对计算机来说却不是那么简单,因为计算机是不会思考的。那计算机要怎么学习呢?这就需要人来指引了。
在机器学习中,人类需要告诉机器如何学习。然后通过人类告诉的学习方法来学习,并得到一个模型。
当然机器学习还有其它一些形式,我们不继续讨论。
2.2、如何学习?
对于机器学习来说,如何学习是一个非常重要的问题。其中已经出现了许多优秀的算法,这些算法的作用都是告诉机器如何学习。比如线性回归、逻辑回归、K近邻、决策树、神经网络等。
机器学习算法可以说是机器学习的灵魂。我们今天要实现的神经网络也是一种机器学习算法,他是建立在逻辑回归的基础之上的,而逻辑回归又建立在线性回归之上。因此线性回归和逻辑回归也是今天要学习的内容。
2.3、机器学习中的问题
机器学习的问题通常分为两大类,一个类是分类,一类是回归。
它们两者的区别是结果是否离散。比如一个动物分类问题,我们得到的结果只可能是一个确定的动物。不会得到一个介于猫狗之间的动物。
而回归问题的结果通常是一个数值,比如房价预测问题。我们可能得到0-100万之间任意一个数值,也可能得到一个类似40.023242的小数。
其中线性回归就是解决回归问题的一大利器,而逻辑回归则是用于分类问题。下面我们就来看看这两个算法。
线性回归和逻辑回归
可能你会好奇,为什么逻辑回归名字里有个回归却是不是解决回归问题的。相信看完下面的内容就不会有这个疑惑了。
3.1、线性回归
在前言中,我们介绍了一个简单的函数:
其实它就是线性回归的基础。线性回归算法就是找到一组最优的w b,让我们得到最接近真实的结果。我们还是用上面的数据:
1, 3, 5, 7, 9
对于上面这组数据,我们是要找序号和数值之间的关系,我们可以把上面的数据理解为:
x, y
1, 1
2, 3
3, 5,
4, 7,
5, 9
其中x表示需要,y表示具体的数值。我们稍加运算就可以得到下面这个函数:
我们得到了最优的一组参数w=2, b = -1,通过这个函数我们就可以预测后面后面一千、一万个数字。
不过有时候我们会有多个x,这时我们就可以把上面的函数推广为:
这时候我们需要求的参数就多多了。下面我们来实际写一个线性回归的程序。
3.2、线性回归实战
这里我们需要使用到scikit-learn模块,安装如下:
pip install scikit-learn
然后我们就可以开始写代码了。线性回归算法的实现被封装在了sklearn.linear_model中的LinearRegression,我们可以直接使用:
import numpy as np
from sklearn.linear_model import LinearRegression
# 准备x的数据
X = np.array([[1],[2],[3],[4],[5]
])
# 准备y的数据
y = np.array([1, 3, 5, 7, 9])
# 创建线性回归模块
lr = LinearRegression()
# 填充数据并训练
lr.fit(X, y)
# 输出参数
print("w=", lr.coef_, "b=", lr.intercept_)
首先我们需要准备X和y的数据,这里我们使用的是ndarray数组。这里需要注意,我们y的的数据长度为5,则X的数据需要是5*n。
准备好数据后我们需要创建线性回归模型,然后调用fit方法填充我们准备好的数据,并训练。
训练完成后我们可以查看一下模块的参数,其中coef_表示w,而intercept_表示b。因为w可以有多个,所以它应该是个数组,下面是输出结果:
w= [2.] b= -1.0
和我们人工智慧得到的结果是一样的。我们还可以调用predict方法预测后面的数据:
import numpy as np
from sklearn.linear_model import LinearRegression
X = np.array([[1],[2],[3],[4],[5]
])
y = np.array([1, 3, 5, 7, 9])
lr = LinearRegression()
lr.fit(X, y)
y_predict = lr.predict(np.array([[100]]))
print(y_predict)
这里同样需要注意X的数据是二维的。
3.3、逻辑回归
逻辑回归可以理解为线性回归+特殊函数。我们可以思考下面这个问题。
现在需要写一个程序来判断每个人的分数是否及格,计分标准为:总分=40%数学+30%语文+30%英语。总分大于等于60为及格,其余为不及格。
虽然是个很简单的问题,但是我们还是需要讨论一下。首先我们可以把计算总分的公式写成下面的形式:
对于这个公式,我们可以得到0-100之间的任何一个数字。但是我想要得到的只有两个结果,及格或者不及格。我们可以简单理解为-1和1。
那我们怎么把上面的结果映射到-1和1上呢?这就需要使用一个特殊的函数了,我们把这个函数叫做激活函数。我们可以用下面这个函数作为激活函数:
这样就可以把所有分数映射到-1和1上了。(上面的函数在y=60处无定义,严格上来讲上面的激活函数是不适用的)逻辑回归的图示如下:
不过在实际应用中,我们通常会使用Sigmoid、Tanh和ReLU函数。下面是几个激活函数的图像:
下面我们来写一个逻辑回归的例子。
3.4、逻辑回归实战
我们用逻辑回归解决是否几个的问题,逻辑回归的实现封装在linear_model.LogisticRegression中,同样可以直接使用,我们直接上代码:
import numpy as np
from sklearn.linear_model import LogisticRegression
# 准备X的数据
X = np.array([[60],[20],[30],[80],[59],[90]
])
# 准备y的数据
y = np.array([1, 0, 0, 1, 0, 1])
# 创建逻辑回归模型
lr = LogisticRegression()
# 填充数据并训练
lr.fit(X, y)
# 准备用于测试的数据
X_test = np.array([[62],[87],[39],[45]
])
# 判断测试数据是否及格
y_predict = lr.predict(X_test)
print(y_predict)
代码和线性回归只有一些细微的差别。在代码中,我们用0表示不及格,1表示及格。下面是我们测试数据输出的结果:
[1 1 0 0]
可以看到所有结果都预测正确了。
有了上面的知识,我们就可以开始实现一个神经网络了。
神经网络
神经网络是建立在逻辑回归之上的,可以说神经网络就是一个逻辑回归的集合。
4.1、神经网络
想必大家都听说过,神经网络是由大量的神经元组成的。不过你可能不知道,机器学习中的神经元就是我们前面学的逻辑回归。我们可以看下面这张图:
至于为什么要使用这么多激活函数可以说就是为了让得到的函数非常复杂。如果我们的函数非常简单,比如下面这组数据:
假如用下面的函数作为我们的模型:
会得到下面这张图像:
可以看到有许多点都不在直线上,所以预测的数据会有很多误差。这个时候我们可以考虑二次,如:
但是有时候二次、三次、甚至十几次都无法得到我们想要的模型(次数过多往往会出现过拟合现象)。这个时候神经网络就是一个很好的选择。
神经网络的可解释性比之前两个算法要差得多,因为神经网络通常有成百上千个参数,我们会得到一个非常复杂的模型。虽然不能理解参数的含义,但是这些参数通常会给我们一个很好的结果。不过这也真是神经网络的神奇之处。
4.2、输入层、隐层、输出层
神经网络通常会有三个部分,输入层由我们的特征数决定。而输出层由我们分类数量决定,如图x部分为输入层,y部分为输出层,而中间部分为隐藏层:
4.3、神经网络实战
使用scikit-learn,我们可以很快搭建一个神经网络。接下来我们用scikit-learn中自带的数据集来实现一个神经网络:
from sklearn.datasets import load_iris
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split# 加载数据集
iris_data = load_iris()
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(iris_data['data'], iris_data['target'], test_size=0.25, random_state=1)
# 创建神经网络模型
mlp = MLPClassifier(solver='lbfgs', hidden_layer_sizes=[4, 2], random_state=0)
# 填充数据并训练
mlp.fit(X_train, y_train)
# 评估模型
score = mlp.score(X_test, y_test)
print(score)
这里我们使用的是scikit-learn自带的鸢尾花数据,我们用train_test_split将数据集分割成了两个部分,分别是训练集的特征和目标值,以及测试集的特征和目标值。
然后我们创建MLPClassifier类的实例,实际上它就是一个用于分类的多重感知机。我们只需要关注hidden_layer_sizes参数即可,它就是我们神经网络的层数和节点数。因为是一个二分类问题,所以这里的输出层有两个节点。
下面输出的结果:
0.9210526315789473
我们调用mlp.score评估模型的好坏,92%的准确率也算是一个非常优秀的结果了。
CSDN协同行业大佬,携手打造13长热门知识图谱及IT成长路线
助力千万IT人成长,快速实现职场进阶!
更多精彩推荐
☞官方抓虫,PyTorch 新版本修复 13 项 Bug☞Arm 十年重磅发布 v9 架构,不受 EAR 约束,未来将覆盖 3000 亿颗芯片☞雷军的最后一次 重 大 创 业
点分享点收藏点点赞点在看
相关文章:

才知道百度也提供了智能DNS服务 - 加速乐
http://jiasule.baidu.com/ 智能DNS 依托百度多年积累的高精度DNS识别库,平均只需5秒全球DNS服务器全部生效,百度蜘蛛1秒生效。抗攻击、无限解析记录,免费支持电信、联通、移动、铁通、教育网、国外、搜索引擎等分线路解析。 极致云加速 百度…

c#中结构与类的区别
类与结构的差别如何选择结构还是类一.类与结构的示例比较:结构示例:public struct Person {string Name;int height;int weightpublic bool overWeight(){//implement something}}类示例:public class TestTime {int hours;int mi…
Samba amp; Nginx - Resource temporarily unavailable
先说说本人的开发环境:Win7 Editplus VMware(CentosSambaNginx)。用Samba在Centos上把web文件夹(如www)共享,然后在Win7上訪问这个文件夹。之所以这么用的原因有: 习惯了Windows。效率比較高Editplus编辑器好用,相对于vi系列来说…

好多Javascript日期选择器呀-7
the Coolest DHTML Calendar 最特別的在於按下月份跟年份的加減按鈕不放,就可以選擇該項目。但實際上按著左鍵拖曳實在是一件很累的事,而且不懂電腦的 End-user 根本就不知道要按著不放,還得特地花時間去說明真的吃力不討好。 正好這次的專案…

话AI、学实践、探未来,亚马逊云科技AI在线大会报名开启!
Innovate 2021亚马逊云科技 AI 在线大会即将在 4 月 22 日举办。届时,亚马逊云科技大中华区产品部总经理顾凡,以及亚马逊云科技全球人工智能技术副总裁、杰出科学家Alex Smola将联袂为您献上精彩的主题演讲。大会开设六大分会场,可谓是别开生…

linux中的一些命令的想法
用户影子文件 ----shadow为什么要有影子文件因为Linux使用不可逆的加密算法来加密口令。加密算法不可逆的,因此***从密文处得不到明文,但/etc/passwd文件是全局可读的,而且加密算法是公开的,一旦用户有机会获取了/etc/passwd文件&…

vstpd服务
1、安装ftpyum install vsftpd -y systemctl start vsftpd systemctl stop firewalld systemctl enable vsftpd setenforce 0 #关闭selinux或者设置selinux不然会对试验造成影响 lftp ip ##能登陆并且显示,表示安装成功2、vsftpd文件信息/var/ftp …

LINQ to XML 建立,读取,增,删,改
LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除。LINQ可以使的生成的XML文档在内存中错落有致。下面以一个小的例子说名LINQ to XML的简单应用。 需要添加必要的引用。System.XML.Linq , System.XML.Xpath使用XDocument 建立一个…

好多Javascript日期选择器呀-6
<script languagejavascript>var DS_x,DS_y; function dateSelector() //构造dateSelector对象,用来实现一个日历形式的日期输入框。{ var myDatenew Date(); this.yearmyDate.getFullYear(); //定义year属性,年份,默认值为当前系…

市值达 58 亿美元,吴恩达的在线教育平台 Coursera 正式上市
整理 | 寇雪芹出品 | AI科技大本营(ID:rgznai100)4 月 1 日,教育科技公司 Coursera 在纽约证券交易所上市,股票代码为 COUR。该股开盘价定为 39 美元 / 股,截至上市当日收盘,股价上涨至 45 美元 / 股&#…

软件包管理RPM
RPM 程序包管理器,可实现对程序包的安装、更新、查询和卸载操作,应用广泛下面通过实际操作来更好的理解RPM的功能安装程序:-i //安装数据包参数-v //显示安装过程-vv //显示更详细的安装信息-h //配合-v更加直观的显示程序安装过程&#…

好多Javascript日期选择器呀-4
<Script LANGUAGE"JavaScript"> var months new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二&q…

SUBSTRING函數用法
---引用---從第二位開始,取三位 select SUBSTRING([價格條件],2,3) FROM [Ame_FSC_SEBGCelERP].[dbo].[物料採購價格信息表] SELECT * FROM [Ame_FSC_SEBGCelERP].[dbo].[物料採購價格信息表] update [Ame_FSC_SEBGCelERP].[dbo].[物料採購價格信息表] set [價格條件]SUBSTRI…

英特尔发布智慧社区解决方案,全栈技术支撑,涵盖五大战略方向
疫情的发生加速了城市智能化治理进程,而智慧社区作为其中的重要组成部分,在AI、大数据等技术的助力下,健康防疫追踪、应急管理等需求和应用也因此得到快速发展。 一般来说,打造智慧社区主要有两大目标,一方面…

OpenGLES 关于 数学 的分支 - 线性变化量、离散量、随机量
关于 数学 的分支 - 线性变化量、离散量、随机量太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商业用途-保持一致”创作公用协议转载请保留此句:太阳火神的漂亮人生 - 本博客专注于 敏捷开发及移动和物联设备研究:iOS、Androi…

好多Javascript日期选择器呀-5
<HTML> <HEAD> <TITLE>最精致的日历式日期输入控件 (Smart Ver 1.00)</TITLE> </HEAD> <style> body {font-size:12px;font-family:"Tahoma"; } td {font-size:12px;font-family:"Tahoma"; } .inputdate {border:1px…

清明出游,你会“鸽”酒店吗?AI 早已看穿一切
来源 | Hyper超神经作者 | 神经小兮头图 | 下载于视觉中国如今,大数据已经被各行各业所应用,酒店行业也不例外。充分利用大数据,使得酒店能够预测市场需求变化,进行智能化决策分析,改善经营状况。各大 OTA(…

ti的硬件时钟和系统时钟同步
1.hwclock -w软到硬 hwclock -s硬到软2. 通过ntp网络时钟控制同步3.etc下的localtime文件和GMT-8转载于:https://www.cnblogs.com/pengkunfan/p/3515517.html

来看看BAT在AR领域的布局,你给打几分?
所谓的AR(增强现实),就是把真实信息和虚拟世界叠加,并使两者具有交互性。换句话说,AR技术不仅让虚拟对象融入到现实世界中,用户还可以对现实世界做出响应。这是一种共生(symbiont)技术,机器与用户的共生。 而当Pokemon…

解决vim没有颜色的办法
首先打开vim,输入命令 scriptnames看看vim加载了哪些脚本。 :scriptnames 输出入下 1: /home/users/xxx/.vimrc2: /home/users/xxx/tools/share/vim/vim73/colors/darkblue.vim3: /home/users/xxx/tools/share/vim/vim73/syntax/syntax.vim4: /home/users/xxx/tools…

好多Javascript日期选择器呀--1
<script languagejavascript>var DS_x,DS_y; function dateSelector() //构造dateSelector对象,用来实现一个日历形式的日期输入框。{ var myDatenew Date(); this.yearmyDate.getFullYear(); //定义year属性,年份,默认值为当前系…

扶贫干部拍胸脯认证,AI开发者上手零门槛,百度打造 “云智一体”全栈开发杀手锏...
“我可以拍着胸脯说识别准确率很高。”扶贫干部刘乐这样评价他在使用百度EasyDL平台助力扶贫的效果,他是陕西省汉中市扶贫信息中心副主任,也是一名热爱编程的程序员。 在近期百度智能云举办的2021云智技术论坛首场活动上,刘乐介绍,…

CSS3 新特性
CSS3 是最新的 CSS 标准,并且完全向后兼容,不过目前W3C 仍然在对 CSS3 规范进行开发,虽然标准的规范还没有正式发布,但是现代浏览器已经支持相当多的 CSS3 属性了。CSS3 提供了很多可以把玩的新特性,模糊了之前只控制样…

在.net中使用GDI+来提高gif图片的保存画质
//本文章有www.blue1000.com翻译,原文地址http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx //尊重他人劳动成果,转载请注明出处。 写程序的时候经常用到gdi,他可以将一幅深色32 bpp图像保存为一个gif文件&…

随记:kickstart远程批量无人值守安装linux
环境:RHEL6.2组件:dhcp tftp vsftp kickstart原理:需安装linux的客户机通过PXE方式启动;通过dhcp取得IP地址;通过TFTP下载引导进程文件pxelinux.0,内核文件vmlinuz,底层驱动initrd.img&…

第五届全国大学生计算机系统能力培养大赛 | 赠书
全国大学生计算机系统能力培养大赛是由教育部高等学校计算机类专业教学指导委员会和系统能力培养研究专家组共同发起,以学科竞赛推动专业建设和计算机领域创新人才培养体系改革、培育我国高端芯片及核心系统的技术突破与产业化后备人才为目标,面向高校大…

玉山银行的一名新员工“玉山小i随身金融顾问”
市场竞争、监管变化、客户体验一直在对金融行业发起挑战,所以无论监管、竞争、客户都会影响金融行业在成本和服务上的创新,金融行业越来越多的开始利用人工智能去满足现有发展提出的要求。 台湾玉山银行的数字化转型就是一个很好的例子。台湾有一句顺口溜…

DataGridView 密码列(显示为*号)的设置
曾经为在DataGridView中设置密码列(显示为*号)而发愁,如何把Windows 窗体 DataGridView 的某一列的数据显示为“*”。 哈哈,今天终于搞定了。需要在DataGridView的2个事件中写代码真麻烦!下面的代码把第4列设置为密码…

在Android中进行单元测试遇到的问题
问题1、Cannot connect to VM socket closed 在使用JUnit进行测试的时候,遇到这个问题。网上的解释是:使用Eclipse对Java代码进行调试,无论是远程JVM还是本地JVM都会进行Socket通讯.发生这样的错误是由于这些软件会修改winsock,还会监听和占用一些端口&…

英特尔第三代 Ice Lake 发布正面与 AMD EPYC PK,结果令人大跌眼镜!
作者 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 导读:传闻已久的第三代英特尔至强可扩展处理器,终于在北京风光最美的4月份发布了。 北京时间4月7日晚,在著名的网红打卡地,百年老首钢工厂遗留下的工业建筑…