python机器学习之神经网络实现
作者:Yaniesta 发布时间:2022-01-10 08:10:05
神经网络在机器学习中有很大的应用,甚至涉及到方方面面。本文主要是简单介绍一下神经网络的基本理论概念和推算。同时也会介绍一下神经网络在数据分类方面的应用。
首先,当我们建立一个回归和分类模型的时候,无论是用最小二乘法(OLS)还是最大似然值(MLE)都用来使得残差达到最小。因此我们在建立模型的时候,都会有一个loss function。
而在神经网络里也不例外,也有个类似的loss function。
对回归而言:
对分类而言:
然后同样方法,对于W开始求导,求导为零就可以求出极值来。
关于式子中的W。我们在这里以三层的神经网络为例。先介绍一下神经网络的相关参数。
第一层是输入层,第二层是隐藏层,第三层是输出层。
在X1,X2经过W1的加权后,达到隐藏层,然后经过W2的加权,到达输出层
其中,
我们有:
至此,我们建立了一个初级的三层神经网络。
当我们要求其的loss function最小时,我们需要逆向来求,也就是所谓的backpropagation。
我们要分别对W1和W2进行求导,然后求出其极值。
从右手边开始逆推,首先对W2进行求导。
代入损失函数公式:
然后,我们进行化简:
化简到这里,我们同理再对W1进行求导。
我们可以发现当我们在做bp网络时候,有一个逆推回去的误差项,其决定了loss function 的最终大小。
在实际的运算当中,我们会用到梯度求解,来求出极值点。
总结一下来说,我们使用向前推进来理顺神经网络做到回归分类等模型。而向后推进来计算他的损失函数,使得参数W有一个最优解。
当然,和线性回归等模型相类似的是,我们也可以加上正则化的项来对W参数进行约束,以免使得模型的偏差太小,而导致在测试集的表现不佳。
Python 的实现:
使用了KERAS的库
解决线性回归:
model.add(Dense(1, input_dim=n_features, activation='linear', use_bias=True))
# Use mean squared error for the loss metric and use the ADAM backprop algorithm
model.compile(loss='mean_squared_error', optimizer='adam')
# Train the network (learn the weights)
# We need to convert from DataFrame to NumpyArray
history = model.fit(X_train.values, y_train.values, epochs=100,
batch_size=1, verbose=2, validation_split=0)
解决多重分类问题:
# create model
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=n_features))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
# Softmax output layer
model.add(Dense(7, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train.values, y_train.values, epochs=20, batch_size=16)
y_pred = model.predict(X_test.values)
y_te = np.argmax(y_test.values, axis = 1)
y_pr = np.argmax(y_pred, axis = 1)
print(np.unique(y_pr))
print(classification_report(y_te, y_pr))
print(confusion_matrix(y_te, y_pr))
当我们选取最优参数时候,有很多种解决的途径。这里就介绍一种是gridsearchcv的方法,这是一种暴力检索的方法,遍历所有的设定参数来求得最优参数。
from sklearn.model_selection import GridSearchCV
def create_model(optimizer='rmsprop'):
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=n_features))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(7, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model
model = KerasClassifier(build_fn=create_model, verbose=0)
optimizers = ['rmsprop']
epochs = [5, 10, 15]
batches = [128]
param_grid = dict(optimizer=optimizers, epochs=epochs, batch_size=batches, verbose=['2'])
grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid.fit(X_train.values, y_train.values)
来源:https://www.cnblogs.com/yaniesta/p/9782802.html
猜你喜欢
- 自动化收集SQLSERVER诊断信息相信很多人都遇到过当SQLSERVER出现问题的时候,而你又解决不了需要DBA或者微软售后支持工程师去帮
- 本文记录了mysql安装详细教程,分享给大家。一、版本的选择之前安装的Mysql,现在才来总结,好像有点晚,后台换系统了,现在从新装上Mys
- 随着PHP4.0和JSP技术的推出以及IIS中不断出现的重大的安全问题,MicroSoft的ASP的市场仿佛是变的狭窄了,但是 MicroS
- while语句打印1-20的整数,并且每行打印五个数,为了实现每行5个数,我们使用一个if判断语句来实现,判断当打印出5个数之后,自动换行打
- dict获取关键字与值values()>>> d{'p': 34, 'l': 54, &#
- 实现效果:实现代码import numpy as npfrom skimage import img_as_floatimport matp
- #!/usr/bin/python#coding=gbkclass User: def __init__
- 本文实例为大家分享了python实现TCP文件接收发送的具体代码,供大家参考,具体内容如下下一篇分享:udp收发的实现先运行服务器端打开接收
- 先说说线程在多线程中,为了保证共享资源的正确性,我们常常会用到线程同步技术.将一些敏感操作变成原子操作,保证同一时刻多个线程中只有一个线程在
- 在html 5增加了新元素header、footer,测试过发现IE不能解析html 5新增的元素。代码如下:<!DOCTYPE ht
- 目的我们的目标是安装一个允许我们托管多个网站的web服务器,其中一些是针对电子商务的安全解决方案,而大部分网站是通过连接一个数据库服务器并且
- 我们以一个例子展开这个题目问题:python类对象A,先实例化一个A对象的实例b,接着给A对象添加一个类共享变量xxx,再实例化一个c,请问
- 简介介绍使用vue3的异步组件动态管理对话框组件,简化对话框组件使用方式。本文使用的是vue3、typescript、element_plu
- 利用上一篇的框架,再写了个翻转棋的程序,为了调试minimax算法,花了两天的时间。几点改进说明:拆分成四个文件:board.py,play
- var arr=['a','b','c'];若要删除其中的'b',有两种方法
- 最近在折腾验证码识别。最终的脚本的识别率在92%左右,9000张验证码大概能识别出八千三四百张左右。好吧,其实是验证码太简单。下面就是要识别
- 1、slice 方法 (Array) 返回一个数组的一段。 arrayObj.slice(start, [en
- 安装部分所需文件在最下方提供STEP1双击mysql-installer-web-community-8.0.18.0.msi进行按钮如果出
- 大家知道,在js里encodeURIComponent 方法是一个比较常用的编码方法,但因工作需要,在asp里需用到此方法,查了好多资料,没
- 一直以来,我们大多使用js来实现弹出菜单,可是根据 w3c 的css标准,根本就没有这个必要。只需要简单得使用css+html就可以做出一个