神经网络的应用(分类和预测)——python

news2025/1/10 3:31:10
神经网络的应用

一.数据预处理

​ 由于神经网络输入数据的范围可能特别大,导致神经网络收敛慢、训练时间长。因此在训练神经网络前一般对数据进行预处理(不妨假设这里的指标都是效益型的(即都是正项指标)),一种重要的预处理的处理手段是归一化处理,就是将数据映射到[0,1]或者[-1,1]区间。

x x x为规格化前的数据 , x m i n 和 x m a x ,x_{min}和x_{max} ,xminxmax x x x的最大值和最小值; x ~ \tilde{x} x~为规格化后的数据, x ˉ \bar{x} xˉ x x x的平均值, s s s x x x的标准差,用python计算标准差时,需要表明自由度是 n n n还是 n − 1 n-1 n1(参数ddof=0自由度为 n n n,ddof=1自由度为 n − 1 n-1 n1)

第一种归一化的线性变换为:
x ~ = x − x m i n x m a x − x min ⁡ (1) \tilde{x}=\frac{x-x_{min}}{x_{max}-x_{\min}}\tag{1} x~=xmaxxminxxmin(1)

​ 该归一化处理一般适用于激活函数是sigmoid函数时。

sigmoid函数:

sigmoid函数也叫Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。Sigmoid作为激活函数有以下优缺点:

优点:平滑、易于求导。

缺点:激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。

Sigmoid函数由下列公式定义:
S ( x ) = 1 1 + e − x S(x)=\frac{1}{1+e^{-x}} S(x)=1+ex1
其导数可用原函数来表示:
S ′ ( x ) = e − x ( 1 + e − x ) 2 = S ( x ) ( 1 − S ( x ) ) S^{\prime}(x)=\frac{e^{-x}}{\left(1+e^{-x}\right)^{2}}=S(x)(1-S(x)) S(x)=(1+ex)2ex=S(x)(1S(x))
sigmoid函数曲线如下:

image-20221209175543338

参考文章:sigmoid函数,百度百科

第二种归一化的线性变换为:
x ~ = 2 x − ( x m i n + x max ⁡ ) x m a x − x min ⁡ = 2 ( x − x min ⁡ ) x m a x − x min ⁡ − 1 (2) \tilde{x}=\frac{2x-\left( x_{min}+x_{\max} \right)}{x_{max}-x_{\min}}=\frac{2\left( x-x_{\min} \right)}{x_{max}-x_{\min}}-1\tag{2} x~=xmaxxmin2x(xmin+xmax)=xmaxxmin2(xxmin)1(2)

上述公式将数据映射到区间[-1,1]上,一般激活函数是 tanh ⁡ \tanh tanh函数时。

tanh函数相较于sigmoid函数要更加常见一些,该函数将区间 ( − ∞ , ∞ ) (-\infty,\infty) (,)映射到 ( − 1 , 1 ) (-1,1) (1,1)

改公式为:
f ( u ) = e u − e − u e u + e − u f\left( u \right) =\frac{e^u-e^{-u}}{e^u+e^{-u}} f(u)=eu+eueueu
函数图像为:

image-20221209184829228

数据预处理也可以进行一般的标准化处理:
x ~ = x − x ˉ s (3) \tilde{x}=\frac{x-\bar{x}}{s}\tag{3} x~=sxxˉ(3)

二.引用举例

我国沪、深两市上市公司中有非ST公司和ST公司,一般而言非ST公司的信用等级较高,ST公司的信用等级较差。为有效评价上市公司信用,建立了上市公司信用评价指标如下:流动比率 x 1 x_1 x1,负债比率 x 2 x_2 x2,存货周转率 x 3 x_3 x3,总资产周转率 x 4 x_4 x4,净资产收益率 x 5 x_5 x5,每股收益率 x 6 x_6 x6,总利润增长率 x 7 x_7 x7,每股经营现金流量 x 8 x_8 x8。已知训练样本和待判样本的数据如表15.9所列,其中类别中的值1表示是ST公司,0表示不是ST公司。

我把数据放在了这里:点击“我”即可,我是svip应该不会失效

提取码:6666

序号 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 x 4 x_4 x4 x 5 x_5 x5 x 6 x_6 x6 x 7 x_7 x7 x 8 x_8 x8类别
10.40439.1515.5510.750.5243.6452.3950.310
21.26354.176.1319.472.19810.3360.4950.1180
30.87111.886.98-18.220.48116.1466.3850.6240
41.31720.3813.1357.790.29919.3961.9370.6730
50.7229.3310.0910.220.4442.51517.5640.30
6-0.19526.280.95-7.590.2920.5964.780.0151
70.32922.761.74-56.570.3570.5433.2380.0871
8-0.001269.39-20.8544.490.0933.4660.123-0.3291
9-0.22273.682.04106.730.6543.1570.8410.0211
100.00542.77-4.15-205.210.4722.6221.882-0.0481
111.56459.86-9.22-313.310.2841.5651.444-0.102待判
120.7413.276.14-7.30.55418.4065.6310.482待判

解:对于正项指标(效益型指标) x 1 , x 3 , x 4 , x 5 , x 6 , x 7 , x 8 x_1,x_3,x_4,x_5,x_6,x_7,x_8 x1,x3,x4,x5,x6,x7,x8,利用公式
x ~ = x i − x i m i n x i m a x − x i m i n , i = 1 , 3 , 4 , 5 , 6 , 7 , 8 \tilde{x}=\frac{x_i-x_{i}^{min}}{x_{i}^{max}-x_{i}^{min}},i=1,3,4,5,6,7,8 x~=ximaxximinxiximin,i=1,3,4,5,6,7,8
进行数据标准化处理,对逆向指标(成本型指标) x 2 x_2 x2,利用公式
x ~ 2 = x 2 m i n − x 2 x 2 m a x − x 2 m i n \tilde{x}_2=\frac{x_{_2}^{min}-x_2}{x_{_2}^{max}-x_{_2}^{min}} x~2=x2maxx2minx2minx2

进行数据标准化处理,其中 x i m i n 和 x i m a x x_{i}^{min}和x_{i}^{max} ximinximax分别代表数据 x i x_i xi的最小值和最大值

我们构造的BP神经元网络只有一个隐层,隐藏神经元的个数为30,激活函数为sigmoid函数,编写程序如下:

注:如果出现代码不能运行的情况,请跳到最后查看可能的解决方法

# coding=utf-8
'''
author:chuanshana
email:2505647237@qq.com
'''
import pandas as pd
from sklearn.neural_network import MLPClassifier
import numpy as np

# 加载数据
data = pd.read_csv("D:\Pycharm\math_machine\公司数据.csv", index_col=0)
# 提取训练样本数据和待判样本数据
train_x = data.loc[:10, :]  # 这就是前9行数据
judge_data = data.loc[10:, :]  # 待判断数据
print(judge_data)
# 逐列计算最大值和最小值
x_max = train_x.max(axis=0)
x_min = train_x.min(axis=0)  # 如果axis=1就是计算每一行的最大值和最小值
print(x_max, "\n", x_min)
# 使用归一化对数据进行处理
# 注意注意,这里我们要转化一下数据类型,不然可能会报错,字符串与字符串无法使用减号
#train_x = train_x.apply(pd.to_numeric)
#x_min = x_min.apply(pd.to_numeric)
#judge_data = judge_data.apply(pd.to_numeric)
#x_max = x_max.apply(pd.to_numeric)  # 到这数据转换完毕
standardization = (train_x - x_min) / (x_max - x_min)
# 这里的x2是逆向指标,我们需要做额外的标准化:
standardization.iloc[:, 1] = (x_min[1] - train_x.iloc[:, 1]) / (x_max[1] - x_min[1])  # 到此我们的训练集数据标准化完成
y_0 = np.hstack([np.zeros(5), np.ones(5)])  # 标号值,5个0,5个1
print("训练集数据标准化已完成", "\n", standardization)
# 构造并拟合模型
model = MLPClassifier(solver="lbfgs", activation="logistic", hidden_layer_sizes=30).fit(standardization, y_0)
# 待判数据标准化
judge_data = (judge_data - x_min) / (x_max - x_min)
# 同样第二列特殊处理
judge_data.iloc[:, 1] = (x_min[1] - judge_data.iloc[:, 1]) / (x_max[1] - x_min[1])
# 进行预测
y_predict = model.predict(judge_data)
print("待判样本类别", y_predict,
      "\n", "属于各个样本的概率", model.predict_proba(standardization), "\n", "训练样本的回带正确率:",model.score(standardization, y_0))

输出以下结果:

待判样本类别 [1. 1. 0.] 
属于各个样本的概率 [[9.98714907e-01 1.28509280e-03]
 [9.99936911e-01 6.30890421e-05]
 [9.99999817e-01 1.83165349e-07]
 [9.99999976e-01 2.43444948e-08]
 [9.99971586e-01 2.84135661e-05]
 [5.37581236e-05 9.99946242e-01]
 [7.15229062e-04 9.99284771e-01]
 [2.12967288e-09 9.99999998e-01]
 [4.15167133e-04 9.99584833e-01]
 [3.82928356e-06 9.99996171e-01]] 
 训练样本的回带正确率: 1.0

即第10家公司是ST公司(这是我们已知的),第11家公司也是ST公司,第12家公司不是ST公司

三.一些需要注意的地方

  • MLPRegressor所需要的参数有哪些

    这个问题让我先问下Chatgpt

    • hidden_layer_sizes:一个整型列表,表示每层隐藏层中神经元的个数。例如,hidden_layer_sizes=(100, 50, 25)表示网络中包含三层隐藏层,每层分别有100、50和25个神经元。
    • activation:表示激活函数的类型。默认情况下,MLPRegressor使用“relu”,即“Rectified Linear Unit”激活函数。此外,还可以选择“logistic”、“tanh”等激活函数。
    • solver:表示用于训练模型的优化算法。常用的优化算法有“lbfgs”、“sgd”和“adam”。
    • alpha:一个浮点数,表示L2正则化项的系数。正则化是一种用于防止过拟合的方法,其中alpha越大,正则化的效果越强。
    • learning_rate_init:一个浮点数,表示优化算法的初始学习率。
  • 当出现unsupported operand type(s) for -: 'str' and 'str'这样的报错时,就要考虑转换数据类型

    #train_x = train_x.apply(pd.to_numeric)
    #x_min = x_min.apply(pd.to_numeric)
    #judge_data = judge_data.apply(pd.to_numeric)
    #x_max = x_max.apply(pd.to_numeric)  # 到这数据转换完毕
    
  • 使用pandas提取某几行数据时,使用df.iloc[]这样提取

  • 我们导入的数据应该是这样的,只有x1到x8的数据,没有分类数据

    image-20221209204801470

课后作业

例 15.12据研究,某地区的公路客运量主要与该地区的人数、机动车数量和公路面积有关,表15.10所列为该地区1990—2009年20年间公路客运量的相关数据。根据有关部门数据,该地区2010年和2011年的人数分别为73.39万人、75.55万人,机动车数量分别为3.9635万辆、4.0975万辆,公路面积分别为0.9880万m2、1.0268万m。请利用BP神经网络预测该地区2010年和2011年的公路客运量。

年份人口数量/万人机动车数量/万辆公路面积/万km2客运量/万人
199020.550.60.095126
199122.440.750.116217
199225.370.850.117730
199327.130.90.149145
199429.451.050.210460
199530.11.350.2311387
199630.961.450.2312353
199734.061.60.3215750
199836.421.70.3218304
199938.091.850.3419836
200039.132.150.3621024
200139.992.20.3619490
200241.932.250.3820433
200344.592.350.4922598
200447.32.50.5625107
200552.892.60.5933442
200655.732.70.5936836
200756.762.850.6740548
200859.172.950.6942927
200960.633.10.7943462

参考解答:
数据地址链接:https://pan.baidu.com/s/1jUsDubJUmvdiipvZdqagZw?pwd=6666
提取码:6666

# coding=utf-8
'''
author:chuanshana
email:2505647237@qq.com
'''
import pandas as pd
from sklearn.neural_network import MLPRegressor
import numpy as np
import pylab as plt

data = pd.read_csv("D:\Pycharm\math_machine\神经网络\某地区公路客运量相关数据.csv", encoding="gbk", index_col=0)
# 同样提取出训练样本数据
train_data = data.iloc[:, :3]
# print(train_data)

y_data = data.iloc[:, 3]
# print(y_data)
# 计算出最大值和最小值
x_min = train_data.min(axis=0)
# print(x_min)
x_max = train_data.max(axis=0)
# print(x_max)
# 进行数据标准化,令我疑惑的一点是这里的y并没有进行标准化
standardization = 2 * ((train_data - x_min) / (x_max - x_min)) - 1
print(standardization)
# 构造并拟合模型
model = MLPRegressor(solver="lbfgs", activation="identity", hidden_layer_sizes=10,
                     ).fit(standardization, y_data)  # 这两个参数加不加values都一样
# 根据给出的数据进行预测
given_data = np.array([[73.39, 3.9635, 0.9880], [75.55, 4.0975, 1.0268]])
print(given_data)
xy_min = (x_min.values)  # 注意看这里重新计算了一下,提取上面的数值
xy_max = (x_max.values)  # 下面也是这样的
given_data_standardization = 2 * (given_data - xy_min) / (xy_max - xy_min) - 1  # 进行数据标准化
y_predict = model.predict(given_data_standardization)
print("预测的数据分别为:", np.round(y_predict, 4))  # 保留四位小数
y_0_predict = model.predict(standardization)  # 对测试集进行预测
print("原数据的预测值为:", y_0_predict)
all_predict = list(y_0_predict) + list(y_predict)
# 计算测试集预测值与真实值的误差,百分之多少
delta = abs((y_0_predict - y_data) / y_data) * 100
print("已知数据的相对误差:", np.round(delta, 4))
# 可视化:
t = np.arange(1990, 2010)
predict_t = np.arange(1990, 2012)
plt.rc("font", size=15);
plt.rc("font", family="KaiTi")
plt.plot(t, y_data, "--o", label="原始数据")
plt.plot(predict_t, all_predict, "-*", label="预测数据")
plt.xticks(predict_t, rotation=55)
plt.grid(True)
plt.legend()
plt.show()

输出预测值分别为 [54449.6164 56573.6837]

image-20221209224718493

本文参考了司守奎的数学建模算法与应用,由于作者是用的txt格式,所以在数据方面还需琢磨一番。比如的pandas的语法,iloc这些

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMake中set_property/get_property的使用

CMake中的set_property命令用于在给定作用域(scope)内设置命名属性&#xff0c;其格式如下&#xff1a; set_property(<GLOBAL |DIRECTORY [<dir>] |TARGET [<target1> ...] |SOURCE [<src1> ...][DIRECTORY <…

小程序AP配网和AK配网教程(开源)

小程序AP配网和AK配网教程&#xff08;开源&#xff09; 一、 Airkiss配网的实现方式 ​ Airkiss配网我们采用插件的形式&#xff0c;非常简单方便。感谢半颗心脏大佬的开源插件。 1. Airkiss 简介 AirKiss是微信硬件平台为Wi-Fi设备提供的微信配网、局域网发现和局域网通讯…

将两个数组进行竖直(水平)方向的拼接 vstack()和hstack()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将两个数组进行竖直(水平)方向的拼接 vstack()和hstack() [太阳]选择题 以下关于Python代码的选项说法错误的一项是? import numpy as np myArray1np.array([1,2,3]) print("【…

主线程与分支线程的访问、修改

任务1&#xff1a;定义一个全局变量 int a10&#xff0c;主线程能否访问到&#xff0c;分支线程能否访问到&#xff1b; 任务2&#xff1a;分支线程中修改上述的a 20, 问主线程中访问该a&#xff0c;是10还是20; 任务3&#xff1a;在主线程定义一个局部变量int b1&#x…

代码随想录刷题day59 503.下一个更大元素II;42. 接雨水

代码随想录刷题day59 503.下一个更大元素II&#xff1b;42. 接雨水 单调栈的一些应用。 503.下一个更大元素II 503. 下一个更大元素 II - 力扣&#xff08;Leetcode&#xff09; 还是下一个最大元素&#xff0c;主要是掌握循环数组中利用%取余的这个操作&#xff0c;在循环…

微服务框架 SpringCloud微服务架构 28 数据同步 28.1 同步方案分析

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构28 数据同步28.1 同步方案分析28.1.1 数据同步问题分析28.1.2 总结28 数据…

Yarn增加新队列-----hive向Yarn提交任务后,Hadoop再次向Yarn提交任务阻塞

博学之&#xff0c;审问之&#xff0c;慎思之&#xff0c;明辨之&#xff0c;笃行之&#x1f3c2; hive on spark搭建好后&#xff0c;任务提交会有问题&#xff0c;因为通过hive会话提交的任务一直存在且不会结束&#xff08;除非关掉这个hive会话&#xff09;&#xff0c;根本…

微服务框架 SpringCloud微服务架构 27 自动补全 27.4 修改酒店索引库数据结构

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构27 自动补全27.4 修改酒店索引库数据结构27.4.1 案例27 自动补全 27.4 修…

Java中的Unsafe的介绍与使用

Java中的Unsafe的介绍与使用 相关文章 美团-Unsafe JavaGuide-Unsafe 什么是Unsafe&#xff1f;&#xff1f;&#xff1f; 如何创建Unsafe对象&#xff1f; 通过反射获取Unsafe对象&#xff08;案例&#xff09; Unsafe功能简介 1. 内存操作 2. 内存屏障 3. 对象操…

猿如意中的【Sublime Text】开发工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 2.3 如何在猿如意中下载Sublime Text &#xff1f; 三、sublime text介绍 四、软件安装过程 五、软件界面 六、sublime text功能特点介绍 七、sublime tex…

【UDS】ISO15765-2之协议数据单元

文章目录简介结构格式分类1.单帧SF2.首帧FF3.流控帧FC4.连续帧CF总结->返回总目录<- 简介 网络层协议数据单元&#xff08;N_PDU&#xff0c;Network_Protocol Data Unit&#xff09;。可以理解成是一种规范协议。而汽车电子中通信的报文格式就是以PDU为传输单元&#…

COM通信栈

基于 AUTOSAR 架构的软件层概述 根据分层AUTOSAR 架构&#xff0c;软件开发是按照以下模块&#xff08;层&#xff09;&#xff08;自下而上&#xff09;实现的&#xff1a; 基本软件 (BSW) 层——这包括以下内容&#xff1a; 微控制器抽象层 (MCAL)电子控制单元 (ECU) 抽象层…

海关统计:全国、各省、各城市进出口贸易数据+地级市进出口贸易、对外贸易数据及进出口月度数据

&#xff08;1&#xff09;2004-2019年地级市进出口贸易总额数据 1、数据来源&#xff1a;各城市统计年鉴、省份统计年鉴 2、时间跨度&#xff1a;2004-2019 3、区域范围&#xff1a;全国287个地级市 4、指标说明&#xff1a; 人民币和美元两种计价方式&#xff0c;人民币…

【应用层】P2P、DNS、递归查询、迭代查询、FTP、电子邮件系统、万维网和HTTP

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录应用层---网络层点到点----传输层端到端------应用层为应用提供多样服务---------功能&#xff1a;文件传输、访问、管理ftp---电子邮件smtp---虚拟终端http-让个人用户直接与大型计算机联系&#xff0c;不必…

web期末作业设计网页——开平碉楼(20页)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

(附源码)SSM财务管理系统 毕业设计 282251

SSM财务管理系统的设计与实现 摘要 现实生活中&#xff0c;许多人风险意识不足&#xff0c;对个人财务风险管理的认识就更少。在进行财务决策时&#xff0c;更多依靠的是以往经验和个人判断&#xff0c;对决策对象缺乏细致的认知、分析和推断&#xff0c;更不用提风险防范与控制…

java中的Collecions类

java.util.Collections类提供了一些静态方法&#xff0c;这些方法能够对List集合实现常用的算法操作&#xff0c;这些算法是排序&#xff0c;填充&#xff0c;移位和查找等。 Collections的常用方法及其简单使用&#xff1a; 代码如下&#xff1a; package Collections; imp…

【考研·计算机组成原理】校验码 小结

本篇目录 前言 一、校验码 1.校验码 2.码距 3.检错与纠错 二、奇偶校验码 三、海明码 1.海明校验码的原理 2.校验位的计算方法 四、CRC码&#xff08;循环冗余校验&#xff09; 总结 前言 跟着王道的考研复习指导&#xff0c;学习了三种校验码&#xff0c;做一个小结。 一、校…

MATLAB应用1——MATLAB傅里叶变换函数封装

主程序&#xff1a; % eximportdata(data3.txt); tx regexp(ex{1}, \s, split);%按照空格分隔字符串,成为单个cell yxstr2double(tx); plot(yx); wwyx(2500:9000)-2055; Fyz_fft(ww,1000); 傅里叶封装函数&#xff1a; function Fyz_fft(y,Fs) % Demon: % Fs 128; …

web前端大作业:诗人文化网页主题网站【唐代诗人】纯HTML+CSS制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…