TensorFlow.NET机器学习入门【2】线性回归
回归分析用于分析输入变量和输出变量之间的一种关系,其中线性回归是最简单的一种。
设: Y=wX+b,现已知一组X(输入)和Y(输出)的值,要求出w和b的值。
举个例子:快年底了,销售部门要发年终奖了,销售员小王想知道今年能拿多少年终奖,目前他大抵知道年终奖是和销售额(特征量)挂钩的,具体什么规则不清楚,那么他大概有两个方法解决这个问题:
1、去问老板,今年的分配规则是什么。【通过算法解决问题】
2、去向同事打听他们的销售额和奖金情况,然后推算自己能拿多少。【通过数据解决问题】
我们当然选择第二种方法了。通过收集数据,我们得到下面这个表格:

拿到这个数据,我们基本上很快就能推算出两者的对应关系,如果推算不出来,我们也可以绘制下面这张图表:

通过图表,我们可以立即看出两者的对应关系了。
以上就是一个典型的线性回归求解的问题,下面我们要用TensorFlow框架解决这个问题。
具体解决思路如下:
1、先设w=1,b=0
2、取得一批训练数据,将X代入函数f(x)=wx+b,计算取得在当前条件下的预测值Y‘
3、计算预测值Y‘和实际值Y的误差
4、根据梯度对w、b进行微调
5、重复上述步骤,直到误差值足够小。
先贴出全部代码,然后再逐一解释。
public class LinearRegression
{
public void Run()
{
// Supper Parameters
float learning_rate = 0.01f; var W = tf.Variable<float>(1);
var b = tf.Variable<float>(0); int epochs = 30;
int steps = 100;
Tensor loss = null; for (int epoch = 0; epoch < epochs; epoch++)
{
for (int step = 0; step < steps; step++)
{
int batch_size = 10;
(NDArray train_X, NDArray train_Y) = LoadBatchData(batch_size); using (var g = tf.GradientTape())
{
//通过当前参数计算预测值
var pred_y = W * train_X + b; //计算预测值和实际值的误差
loss = tf.reduce_sum(tf.pow(pred_y - train_Y, 2)) / batch_size; //计算梯度
var gradients = g.gradient(loss, (W, b)); //更新参数
W.assign_sub(learning_rate * gradients.Item1);
b.assign_sub(learning_rate * gradients.Item2);
}
} Console.WriteLine($"Epoch{epoch + 1}: loss = {loss.numpy()}; W={W.numpy()},b={b.numpy()}");
}
} public (NDArray, NDArray) LoadBatchData(int n_samples)
{
float w = 0.02f;
float b = 1.0f; NDArray train_X = np.arange<float>(start: 1, end: n_samples + 1);
NDArray train_Y = train_X * w + b; return (train_X, train_Y);
}
}
下面对代码进行简单的解释:
首先,我们要读取一批(比如10组 )训练数据,标记为:train_X和train_Y,然后通过现有的w和b值计算预测值:pred_Y=w*train_X_b,此时train_X、train_Y、pred_Y都是10个数据长度的数组。
然后计算预测数据和时间数据之间的误差,我们采用均方误差公式来计算:

然后开始计算W、b对于loss函数的梯度,梯度表达的就是W、b的变化对计算结果的影响,比如将W增大一点,loss的计算结果是变大还是变小,我们的目标是希望loss的值最小,如果w变大时loss变大(梯度为正数),那么我们下一次就将w变小一点,反之同理。

这里的learning_rate表示学习率,表示每次参数进行调整的步进值,就是每次调整一大步,还是一小步。通过多次的循环调整,w和b的值将调整为一个合适的数字,此时loss的值将会很小,线性回归就完成了。以下是运算结果:

在上述过程中,最难理解的就是梯度,以及如何计算梯度的问题,想要进一步了解的话可以参阅相关参考资料。
【相关资源】
源码:Git: https://gitee.com/seabluescn/tf_not.git
项目名称:LinearRegression
【参考资料】
《深度学习入门:基于Python的理论与实践(斋藤康毅)》,网上可以找到电子版
TensorFlow.NET机器学习入门【2】线性回归的更多相关文章
- TensorFlow.NET机器学习入门【0】前言与目录
曾经学习过一段时间ML.NET的知识,ML.NET是微软提供的一套机器学习框架,相对于其他的一些机器学习框架,ML.NET侧重于消费现有的网络模型,不太好自定义自己的网络模型,底层实现也做了高度封装. ...
- TensorFlow.NET机器学习入门【1】开发环境与类型简介
项目开发环境为Visual Studio 2019 + .Net 5 创建新项目后首先通过Nuget引入相关包: SciSharp.TensorFlow.Redist是Google提供的TensorF ...
- TensorFlow.NET机器学习入门【3】采用神经网络实现非线性回归
上一篇文章我们介绍的线性模型的求解,但有很多模型是非线性的,比如: 这里表示有两个输入,一个输出. 现在我们已经不能采用y=ax+b的形式去定义一个函数了,我们只能知道输入变量的数量,但不知道某个变量 ...
- TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题
上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...
- TensorFlow.NET机器学习入门【5】采用神经网络实现手写数字识别(MNIST)
从这篇文章开始,终于要干点正儿八经的工作了,前面都是准备工作.这次我们要解决机器学习的经典问题,MNIST手写数字识别. 首先介绍一下数据集.请首先解压:TF_Net\Asset\mnist_png. ...
- TensorFlow.NET机器学习入门【6】采用神经网络处理Fashion-MNIST
"如果一个算法在MNIST上不work,那么它就根本没法用:而如果它在MNIST上work,它在其他数据上也可能不work". -- 马克吐温 上一篇文章我们实现了一个MNIST手 ...
- TensorFlow.NET机器学习入门【7】采用卷积神经网络(CNN)处理Fashion-MNIST
本文将介绍如何采用卷积神经网络(CNN)来处理Fashion-MNIST数据集. 程序流程如下: 1.准备样本数据 2.构建卷积神经网络模型 3.网络学习(训练) 4.消费.测试 除了网络模型的构建, ...
- TensorFlow.NET机器学习入门【8】采用GPU进行学习
随着网络越来约复杂,训练难度越来越大,有条件的可以采用GPU进行学习.本文介绍如何在GPU环境下使用TensorFlow.NET. TensorFlow.NET使用GPU非常的简单,代码不用做任何修改 ...
- 45、Docker 加 tensorflow的机器学习入门初步
[1]最近领导天天在群里发一些机器学习的链接,搞得好像我们真的要搞机器学习似的,吃瓜群众感觉好神奇呀. 第一步 其实也是最后一步,就是网上百度一下,Docker Toolbox,下载下来,下载,安装之 ...
随机推荐
- 删除本地仓库中的lastUpdated文件.bat
@echo off @ ECHO. @ ECHO. @ ECHO. 说 明 @ ECHO ------------------------------------------------------- ...
- Codeforces 840C - On the Bench(dp/容斥原理)
Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2500 的 D1C,可个人认为难度堪比某些 *2700 *2800. 不过嘛,*2500 终究还是 *2500,还是被我自己 ...
- azkaban执行任务长时间无法结束
问题显示: 由于一次执行较多的任务,导致azkaban的web程序崩溃,此时,关闭azkaban服务,重新启动azkaban 但是由于azkaban的exec程序无法关闭,这里采用kill的方式关掉e ...
- Macbook pro进入恢复模式以及无法进入恢复模式解决方案
看网上很多说用Command+R进入恢复模式,但是,大部分都反馈说,此命令并不能进入恢复模式.我自己也尝试发现了同样问题,最终发现解决方案: 问题出在,[是重新启动电脑,而不是关机+按开机键,否则会造 ...
- LR SP PC
LR SP PC 深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种 ...
- Python中类的各式方法介绍
本文类的方法介绍包括类方法.属性方法.静态方法.修改属性方法等内置装饰器装饰的方法,以及类的一些特殊成员方法 1. 类的特殊成员方法 1.1 构造方法 # -*- coding:utf-8 -*- # ...
- 省时省心DTM,广告转化无难题
内容来源:华为开发者大会2021 HMS Core 6 App Services技术论坛,主题演讲<华为分析服务,助您打造数智化运营闭环方案>. 演讲嘉宾:华为消费者云服务 分析产品总监 ...
- c#跳转
Response.Redirect(EditUrl("MEUID", lblMEUID.Text, "Page2", "PageOneMK" ...
- A Child's History of England.27
Then, the Red King went over to Normandy, where the people suffered greatly under the loose rule of ...
- 【leetcode】952. Largest Component Size by Common Factor(Union find)
You are given an integer array of unique positive integers nums. Consider the following graph: There ...