深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)

人工智能28

🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝
🥰 博客首页:knighthood2001
😗 欢迎点赞👍评论🗨️
❤️ 热爱python,期待与大家一同进步成长!!❤️
👀 给大家推荐一款很火爆的刷题、面试求职网站 👀

目录

三好学生成绩问题的引入

搭建解决三好学生成绩问题的神经网络

构建的神经网络的代码

代码讲解

三好学生成绩问题的引入

我们来看这样一个问题: 某个学校将要评选三好学生,我们知道,三好学生的"三好"指的是品德好、学习好、体育好:而要进行评选,如今都需要 量化,也就是说 学校会根据德育分、智育分和体育分3项分数来计算一个总分, 然后根据总分来确定谁能够被评选为三好学生。 假设这个学校计算总分的规则是:德育分占60% ,智育分占30%,体育分占10% 。这个规则如果用一个公式来表达是这样的
总分=德育分0.6 +智育分 0.3 +体育分*0.1

可以看到,计算三好学生总成绩的公式实际上是把3项分数各自乘上一个权重(weight)值,然后相加求和。

以上是我们要解决问题的背景。那么,我们需要 解决的问题是这样的:有两位孩子的家长,知道了自己孩子的3项分数及总分,但是 学校并没有告诉家长们计算出总分的规则。家长们猜测出计算总分的方法肯定是把3项分数乘以不同的权重后相加来获得,唯一不知道的就是这几个权重值到底是多少。现在家长们就想用人工智能中神经网络的方法来大致推算出这3个权重分别是多少。我们假设第一位家长的孩子A的 德育分是90、智育分是80、 体育分是70、总分是85,并分别用 w1、w2、w3来代表德育分、智育分和体育分所乘的权重,可以得到这个式子:
90 * w1 + 80 * w2 + 70 * w3 = 85

另一位孩子B的 德育分是98、智育分是95、体育分是87、总分是96,我们可以得到这个式子:
98 * w1 + 95 * w2 + 87 * w3 = 96

从数学中解方程式的方法来说,这两个式子中一共有3个未知数,理论上只要有3个不等价的式子,就可以解出答案了。但我们恰恰只有两个学生的数据,只能凑出两个式子,也就无法用解方程的方法解决这个问题。那么这时候,就可以用到 神经网络的方法来尝试解决这个问题。

搭建解决三好学生成绩问题的神经网络

理论知识

深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)

神经网络模型图一般均包含1个输入层、1个或多个隐藏层,以及1个输出层。

②一般来说, 输入层是描述输入数据的形态的;我们用方块来代表每条输入数据的一个数 (或者叫一个字段),叫作输入节点;输入节点一般用x来命名,如果有多个数值,则用x1,x2,...,xn来代表。

隐藏层是描述我们设计的神经网络模型结构中最重要的部分;隐藏层可能有多个;每一层中都会有1个或多个神经元,我们用圆圈来表示,叫做神经元节点或隐藏节点,有时也直接简称为节点;每一个节点都接收上一层传来的数据并进行一定的运算后向下一层输出数据,符合神经元的特性,神经元节点上的这些运算称为计算操作或操作(operation,简称op)

输出层一般是神经网络模型的最后一层,会包含1个或多个以菱形表示的输出节点,输出节点代表着整个神经网络计算的最后结果:输出层的节点一般习惯上用y来命名,但并非必须。

⑤我们在神经网络模型图中,一般约定在各个节点的 右下方(有时候因为拥挤也会在左下方)标记节点的名称,在节点的 左上方标记该节点所做的计算,例如,x1、x2、x3、n1、n2、n3、y都是节点名称,"w1"、 "w2"、 "*w3"这些都代表节点运算。

现在我们回到模型本身,这是一个标准的 前馈神经网络,即信号总是往前传递的神经网络。输入层有3个节点x1、x2、x3,分别代表前面所说的德育分、智育分和体育分。因为问题比较简单,隐藏层我们只设计了一层,其中有3个节点n1、n2、n3,分别对3个输入的分数进行处理,处理的方式就是分别乘以3个权重w1、w2、w3。输出层只有一个节点y, 因为我们只要求一个总分数值; 节点y的操作就是把n1、n2、n3这3个节点输出过来的数值进行 相加求和

构建的神经网络的代码

import tensorflow as tf
# placeholder和eager execution不兼容
tf.compat.v1.disable_eager_execution()

# 定义三个输入节点
x1 = tf.compat.v1.placeholder(dtype=tf.float32)
x2 = tf.compat.v1.placeholder(dtype=tf.float32)
x3 = tf.compat.v1.placeholder(dtype=tf.float32)

# 定义权重(可变参数)
w1 = tf.Variable(0.1, dtype=tf.float32)
w2 = tf.Variable(0.1, dtype=tf.float32)
w3 = tf.Variable(0.1, dtype=tf.float32)

# 隐藏层
n1 = x1 * w1
n2 = x2 * w2
n3 = x3 * w3

# 输出层
y = n1 + n2 + n3

# 会话,管理神经网络运行的一个对象
sess = tf.compat.v1.Session()

init = tf.compat.v1.global_variables_initializer()

# 在sess会话中运行初始化这个函数
sess.run(init)

# 执行一次神经网络的计算
result = sess.run([x1, x2, x3, w1, w2, w3, y], feed_dict={x1: 90, x2: 80, x3: 70})
print(result)
# [array(90., dtype=float32), array(80., dtype=float32), array(70., dtype=float32), 0.1, 0.1, 0.1, 24.0]

代码讲解

tf.compat.v1.disable_eager_execution()

需要加这个,原因是placeholder和eager execution不兼容

# 定义三个输入节点
x1 = tf.compat.v1.placeholder(dtype=tf.float32)
x2 = tf.compat.v1.placeholder(dtype=tf.float32)
x3 = tf.compat.v1.placeholder(dtype=tf.float32)

定义3个输入节点, placeholder(占位符),所谓占位符,就是在编写程序时还不确定要输入什么数,而在程序运行的时候才会输入,编程时仅仅把这个节点定义好,先"占个位子"。

dtype是"data type"的缩写,表示占位符所代表的数值的类型,tf.float32是tensorflow中的32位浮点数,即用32位二进制来代表一个小数,一般32位浮点数能满足计算的需要。

# 定义权重(可变参数)
w1 = tf.Variable(0.1, dtype=tf.float32)
w2 = tf.Variable(0.1, dtype=tf.float32)
w3 = tf.Variable(0.1, dtype=tf.float32)

这里用来定义每个分数的权重,在神经网络中, 类似权重这种会在训练中经常性的变化的神经元参数,tensorflow把他们叫做变量。

定义w1、w2、w3的形式除了函数用的是 tf.Variable函数外,其他与定义占位符x1、x2、x3的时候类似,还有一点不同是除了用dtype参数来指定数值类型,还 传入了另一个初始值参数,这个参数没有用命名参数的形式,这是因为tf.Variable函数规定第一个参数是用于指定可变参数的初始值有可以看到,我们把w1、w2、w3的初始值都设置为0.1。

# 隐藏层
n1 = x1 * w1
n2 = x2 * w2
n3 = x3 * w3

# 输出层
y = n1 + n2 + n3

这里定义了隐藏层和输出层。

以上完成了神经网络模型的定义,然后看看如何在这个神经网络中输入数据并得到运算结果。

[En]

The above completed the definition of the neural network model, and then take a look at how to input data in this neural network and get the operation results.

# 会话,管理神经网络运行的一个对象
sess = tf.compat.v1.Session()

init = tf.compat.v1.global_variables_initializer()

# 在sess会话中运行初始化这个函数
sess.run(init)

首先定义一个sess变量,它包含一个会话(session)对象,我们可以把 会话简单的理解为管理神经网络运行的一个对象,有了会话对象,我们的神经网络就可以正式运转。

会话对象管理神经网络的第一步,一般是要把所有的可变参数初始化,也就是给所有可变参数一个各自的初始值,

首先让变量init 等于global_variables_initializer 这个函数的返回值,它返回的是一个专门用于初始化可变参数的对象。然后调用会话对象sess的成员函数run(),带上init变量作为参数,就可以实现对我们之前定义的神经网络模型中所有可变参数的初始化。run(init)就是在sess会话中运行初始化这个函数。具体给每个可变参数赋什么样的初值,是由我们刚才在定义w1、w2、w3时的第一个参数来决定的。我们把它设置为了0.1.

# 执行一次神经网络的计算
result = sess.run([x1, x2, x3, w1, w2, w3, y], feed_dict={x1: 90, x2: 80, x3: 70})
print(result)
# [array(90., dtype=float32), array(80., dtype=float32), array(70., dtype=float32), 0.1, 0.1, 0.1, 24.0]
result = sess.run([x1, x2, x3, w1, w2, w3, y], feed_dict={x1: 98, x2: 95, x3: 87})
print(result)
# [array(98., dtype=float32), array(95., dtype=float32), array(87., dtype=float32), 0.1, 0.1, 0.1, 28.0]

这里我们进行了真正意义上的的计算,sess.run函数的 第一个参数为一个数组,代表我们需要查看哪些结果项; 另一个参数feed_dict,代表我们要输入的数据。

结果如下

# [array(90., dtype=float32), array(80., dtype=float32), array(70., dtype=float32), 0.1, 0.1, 0.1, 24.0]
# [array(98., dtype=float32), array(95., dtype=float32), array(87., dtype=float32), 0.1, 0.1, 0.1, 28.0]

经过验算:

900.1+800.1+70*0.1=24

980.1+950.1+87*0.1=28

正确, 说明我们搭建的神经网络计算的结果是正确的。

后续进行训练神经网络,敬请期待......

Original: https://blog.csdn.net/knighthood2001/article/details/125464728
Author: knighthood2001
Title: 深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)



相关阅读

Title: Pandas常用累计、同比、环比等统计方法实践案例

统计表中常常以本年累计、上年同期(累计)、当期(例如当月)完成、上月完成为统计数据,并进行同比、环比分析。如下月报统计表所示样例,本文将使用Python Pandas工具进行统计。
深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)
其中:

  • (本年)累计:是指本年1月到截止月份的合计数
  • (上年)同期(累计):是指去年1月到与本年累计所对应截止月份的合计数
  • 同比(增长率)=(本期数-同期数)/同期数*100%
  • 环比(增长率)=(本期数-上期数)/上期数*100%

注:这里的本期是指本月完成或当月完成,上期数是指上月完成。

示例数据:
深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)

注:为了演示方便,本案例数据源仅使用2年,且每年5个月的数据。

; 1. (本年)累计

在统计分析的发展中,按年和按月积累一些统计数据是相当常见的。对于数据,就是按规则逐行累计数据。

[En]

In the development of statistical analysis, it is quite common to accumulate some statistical data on an annual and monthly basis. For data, it is to accumulate data row by row according to the rules.

Pandas中的cumsum()函数可以实现按某时间维度累计需求。


import pandas as pd

df = pd.read_csv('data2021.csv')
cum_columns_name = ['cum_churncount','cum_newcount']
df[cum_columns_name] = df[['years','churncount','newcount']].groupby(['years']).cumsum()

注:其中分组'years'是指年度时间维度累计。

计算结果如下:
深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)

2. (上年)同期累计

对于(上年)同期累计,将直接取上一年度累计值的同月份数据。pandas DataFrame.shift()函数可以把数据移动指定的行数。
深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)
接续上列,读取同期数据。首先是把'yearmonth'上移五行,如上图所示得到新的DataFrame,通过'yearmonth'进行两表数据关联(左关联:左侧为原表,右侧为移动后的新表),实现去同期数据效果。

cum_columns_dict = {'cum_churncount':'cum_same_period_churncount',
                        'cum_newcount':'cum_same_period_newcount'}
df_cum_same_period = df[['cum_churncount','cum_newcount','yearmonth']].copy()
df_cum_same_period = df_cum_same_period.rename(columns=cum_columns_dict)

df_cum_same_period.loc[:,'yearmonth'] = df_cum_same_period['yearmonth'].shift(-5)

df = pd.merge(left=df,right=df_cum_same_period,on='yearmonth',how='left')

3. 上月(完成)

取上月的数据,使用pandas DataFrame.shift()函数把数据移动指定的行数。

接续上列,读取上期数据。(与取同期原理一样,略)

last_mnoth_columns_dict = {'churncount':'last_month_churncount',
                        'newcount':'last_month_newcount'}
df_last_month = df[['churncount','newcount','yearmonth']].copy()
df_last_month = df_last_month.rename(columns=last_mnoth_columns_dict)

df_last_month.loc[:,'yearmonth'] = df_last_month['yearmonth'].shift(-1)
df = pd.merge(left=df,right=df_last_month,on='yearmonth',how='left')

4. 同比(增长率)

计算同比涉及到除法,需要剔除除数为零的数据。

df.fillna(0,inplace=True)

df.loc[df['cum_same_period_churncount']!=0,'cum_churncount_rat'] = (df['cum_churncount']-df['cum_same_period_churncount'])/df['cum_same_period_churncount']
df.loc[df['cum_same_period_newcount']!=0,'cum_newcount_rat'] =  (df['cum_newcount']-df['cum_same_period_newcount'])/df['cum_same_period_newcount']
df[['yearmonth','cum_churncount','cum_newcount','cum_same_period_churncount','cum_same_period_newcount','cum_churncount_rat','cum_newcount_rat']]

深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)

5. 环比(增长率)


df.loc[df['last_month_churncount']!=0,'churncount_rat'] = (df['churncount']-df['last_month_churncount'])/df['last_month_churncount']
df.loc[df['last_month_newcount']!=0,'newcount_rat'] =  (df['newcount']-df['last_month_newcount'])/df['last_month_newcount']
df[['yearmonth','churncount','newcount','last_month_churncount','last_month_newcount','churncount_rat','newcount_rat']]

深度学习(初识tensorflow2.版本)之三好学生成绩问题(1)

6. 总结

pandas做统计计算功能方法比较多,这里总结用到的技术有累计cumsum()函数、移动数据shift()函数、表合并关联merge()函数,以及通过loc条件修改数据。

Original: https://blog.csdn.net/xiaoyw/article/details/122979421
Author: 肖永威
Title: Pandas常用累计、同比、环比等统计方法实践案例

相关文章
SSD算法解析 人工智能

SSD算法解析

目标检测算法主要分为两类: Two-stage方法:如R-CNN系列算法,主要思路就是通过Selective Search或者CNN网络产生一系列的稀疏矩阵的候选区域,然后对这些候选区域进行分类和回归...
Python安装与PyCharm新建工程(超详细) 人工智能

Python安装与PyCharm新建工程(超详细)

总论(这是我的总结可以不看直接看下面的安装) 1、 不用看那些版本对应表啊!!!! 记录那些年自己掉过的坑,自己也是看了其他人好多博客,总结下来一个核心问题是要求版本对应,发现大家都是这样教的,以这样...
BN和神经网络调优 人工智能

BN和神经网络调优

抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。 Original: https://blog.cs...
聚类分析和K-means&Dbscan原理 人工智能

聚类分析和K-means&Dbscan原理

聚类分析和K-means&Dbscan原理 聚类概念 无监督问题:手里没有标签 聚类:相似的东西分为一组 难点:如何评估、如何调参 K-means算法 基本概念 要得到簇的个数,需要指定K值 ...