回归问题

前期

假设已有某样例,参数为w=1.477, b=0.089,即为\(y=1.477x+0.089\)

过程分析

数据采样

首先我们需要模拟一些带有真实样本观测误差的数据(因为真实情况是真实模型我们已经知道了),所以我们在这里给模型添加误差自变量\(\epsilon\),其采样自均值为0,标准差为0.01的高斯分布:

\[y=1.477x+0.089+\epsilon,\epsilon\sim N(0, {0.01}^2)
\]

通过随机采样100次获得训练数据集

data = []
for i in range(100):
x=np.random.uniform(-10., 10.)
eps=np.random.normal(0., 0.01)
y=1.477*x+0.089+eps
data.append([x,y])
data=np.array(data)

MSE

计算每个点的预测值与真实值之间差的平方并累加,获得均方误差损失值

def mse(b, w, points): # 误差计算
totalError=0
for i in range(0, len(points)):#循环迭代
x=points[i, 0]
y=points[i, 1]
totalError+=(y-(w*x+b))**2
return totalError/float(len(points))# 求均方差

最后的误差和除以样本总数得到平均误差

梯度计算

这里首先需要推导一下梯度的表达式

\[\frac{\alpha L}{\alpha w}=\frac{\alpha \frac{1}{n}\sum_{i=1}^{n}{(wx^{(i)}+b-y^{(i)})}^2}{\alpha w}=\frac{1}{n}\sum_{i=1}^{n}\frac{\alpha{(wx^{(i)}+b-y{(i)})}^2}{\alpha w}
\]

所以可以得到

\[\frac{\alpha L}{\alpha w}=\frac{2}{n}\sum_{i=1}^n(wx^{(i)}+b-y^{(i)}·x^{(i)})
\]

同理,可以推导得到

\[\frac{\alpha L}{\alpha b}=\frac{1}{n}\sum_{i=1}^n2(wx^{(i)}+b-y^{(i)})·1
\]

所以,我们只需要计算出上述两个值,平均以后即可得到偏导数

def stepdown_gradient(b_current, w_current, points, lr):
b_gradient=0
w_gradient=0
M=float(len(points))#样本总数
for i in range(0, len(points)):
x=points[i, 0]
y=points[i, 1]
b_gradient+=(2/M)*((w_current * x + b_current) - y)
w_gradient+=(2/M)*x*((w_current*x + b_current)-y)
new_b=b_current-(lr*b_gradient)
new_w=w_current-(lr*w_gradient)
return [new_b,new_w]

梯度更新

我们可以根据计算出的误差函数在w和b处的梯度后,根据\(x^`=x-\eta\triangledown f\)更新w和b的值。对数据集的所有样本训练一次称为一个Epoch,共循环迭代num_iterations个Epoch

def gradient_descent(points, starting_b, starting_w, lr, num_iterations):
b=starting_b
w=starting_w for step in range(num_iterations):
b, w=stepdown_gradient(b, w, np.array(points), lr)
loss=mse(b, w, points)
if step%50==0:
print(f"iteration:{step}, loss:{loss}, w:{w}, b:{b}")
return [b, w]

完整程序

def mse(b, w, points): # 误差计算
totalError=0
for i in range(0, len(points)):#循环迭代
x=points[i, 0]
y=points[i, 1]
totalError+=(y-(w*x+b))**2
return totalError/float(len(points))# 求均方差
def stepdown_gradient(b_current, w_current, points, lr):
b_gradient=0
w_gradient=0
M=float(len(points))#样本总数
for i in range(0, len(points)):
x=points[i, 0]
y=points[i, 1]
b_gradient+=(2/M)*((w_current * x + b_current) - y)
w_gradient+=(2/M)*x*((w_current*x + b_current)-y)
new_b=b_current-(lr*b_gradient)
new_w=w_current-(lr*w_gradient)
return [new_b,new_w]
def gradient_descent(points, starting_b, starting_w, lr, num_iterations):
b=starting_b
w=starting_w for step in range(num_iterations):
b, w=stepdown_gradient(b, w, np.array(points), lr)
loss=mse(b, w, points)
if step%50==0:
print(f"iteration:{step}, loss:{loss}, w:{w}, b:{b}")
return [b, w] data = []
for i in range(100):
x=np.random.uniform(-10., 10.)
eps=np.random.normal(0., 0.01)
y=1.477*x+0.089+eps
data.append([x,y])
data=np.array(data)
lr=0.01
initial_b=0
initial_w=0
num_iterations=1000
[b, w]=gradient_descent(data, initial_b, initial_w, lr, num_iterations)
loss=mse(b, w, data)
print(f'Fina loss:{loss}, w:{w}, b:{b}')

运行结果:

iteration:0, loss:6.162441874953508, w:1.0617677882731775, b:-0.014516689518537094
iteration:50, loss:0.0017523594804364892, w:1.4762089816223927, b:0.04897703734558919
iteration:100, loss:0.00033386053656463924, w:1.4766149652009066, b:0.0747027092487452
iteration:150, loss:0.00014236473287524616, w:1.4767641324874572, b:0.08415488632085935
iteration:200, loss:0.00011651300912947552, w:1.476818939825868, b:0.08762782384952462
iteration:250, loss:0.0001130230547401269, w:1.476839077246164, b:0.08890385740094789
iteration:300, loss:0.0001125519147202384, w:1.476846476176817, b:0.08937270016328336
iteration:350, loss:0.00011248831133360896, w:1.4768491947064997, b:0.08954496329503976
iteration:400, loss:0.00011247972494608194, w:1.4768501935540335, b:0.08960825655441457
iteration:450, loss:0.00011247856579317109, w:1.476850560552563, b:0.08963151188851563
iteration:500, loss:0.00011247840930879765, w:1.476850695395886, b:0.08964005640920385
iteration:550, loss:0.00011247838818357833, w:1.4768507449402855, b:0.08964319585383505
iteration:600, loss:0.00011247838533169705, w:1.4768507631439864, b:0.0896443493547688
iteration:650, loss:0.00011247838494669628, w:1.476850769832426, b:0.0896447731763553
iteration:700, loss:0.00011247838489472176, w:1.4768507722899058, b:0.08964492889771788
iteration:750, loss:0.00011247838488770622, w:1.4768507731928378, b:0.08964498611316783
iteration:800, loss:0.00011247838488675786, w:1.4768507735245948, b:0.0896450071353812
iteration:850, loss:0.00011247838488663068, w:1.4768507736464898, b:0.08964501485940428
iteration:900, loss:0.00011247838488661222, w:1.4768507736912766, b:0.08964501769738008
iteration:950, loss:0.00011247838488661079, w:1.476850773707732, b:0.08964501874011474
Fina loss:0.00011247838488660875, w:1.4768507737137073, b:0.08964501911873728

所以,当迭代100次之后,w和b的值就已经比较接近真实模型了。

ML-程序练习-Dragon的更多相关文章

  1. TensorFlow 2.0 新特性

    安装 TensorFlow 2.0 Alpha 本文仅仅介绍 Windows 的安装方式: pip install tensorflow==2.0.0-alpha0 # cpu 版本 pip inst ...

  2. RaxML使用

    1.下载 https://github.com/stamatak/standard-RAxML 2.How many Threads shall I use? 重要的是要知道,RAxML PThrea ...

  3. TensorFlow 2.0高效开发指南

    Effective TensorFlow 2.0 为使TensorFLow用户更高效,TensorFlow 2.0中进行了多出更改.TensorFlow 2.0删除了篇冗余API,使API更加一致(统 ...

  4. 利用ML&AI判定未知恶意程序——里面提到ssl恶意加密流检测使用N个payload CNN + 字节分布包长等特征综合判定

    利用ML&AI判定未知恶意程序 导语:0x01.前言 在上一篇ML&AI如何在云态势感知产品中落地中介绍了,为什么我们要预测未知恶意程序,传统的安全产品已经无法满足现有的安全态势.那么 ...

  5. 如何在应用程序中使用ML.NET?

    https://www.cnblogs.com/shanyou/p/9190701.html ML.NET以NuGet包的形式提供,可以轻松安装到新的或现有的.NET应用程序中. 该框架采用了用于其他 ...

  6. 2017年"程序媛和工程狮"绝对不能忽视的编程语言、框架和工具

      2017年"程序媛和工程狮"绝对不能忽视的编程语言.框架和工具 在过去的一年里,软件开发行业继续大踏步地向前迈进.回顾 2016 年,我们看到了更多新兴的流行语言.框架和工具, ...

  7. 用VC2010以上版本编译可以在低版本XP和2003的运行程序的方法

    2013-09-17   作者:佚名   来源:本站整理   浏览:2001   评论:1   一直以来倍受此事困拢,vc2010以上版本编译出的exe或dll总是会引用kernel32.dll的En ...

  8. 【系统篇】从int 3探索Windows应用程序调试原理

    探索调试器下断点的原理 在Windows上做开发的程序猿们都知道,x86架构处理器有一条特殊的指令——int 3,也就是机器码0xCC,用于调试所用,当程序执行到int 3的时候会中断到调试器,如果程 ...

  9. python成长之路-----day1-----作业(登录程序和三级菜单)

    作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...

  10. 浅谈VB.Net 程序的编译和动态编译

    ---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译 ...

随机推荐

  1. python投票一致性指数(IVC)实现代码

    毕业论文中用于计算联合国会员国间在联合国大会上的投票一致性(IVC) import pandas as pd import sqlite3 import networkx as nx import t ...

  2. vue 打包后可放置在任意名称的文件夹下

    1. build->utils.js: 2. build->webpack.prod.conf.js: 3. config->index.js:

  3. snpEFF注释的vcf文件转化成maf文件

    利用一个perl语言写的工具:snpeffTomaf 一行代码即可实现非常方便 github地址链接:https://github.com/tsy19900929/snpeffToMaf 将此仓库中的 ...

  4. 12.20linux学习第十九天

    今天老刘开始讲第17章 使用iSCSI服务部署网络存储.第18章 使用MariaDB数据库管理系统和第19章 使用PXE+Kickstart无人值守安装服务,内容有点多. 7.1 iSCSI技术介绍 ...

  5. Java (新)将Excel数据读取到ListMap

    Java (新)将Excel数据读取到ListMap Maven依赖: pom.xml <!-- excel --> <dependency> <groupId>o ...

  6. 08 分布式计算MapReduce--词频统计

    def getText(): txt=open("D:\\test.txt","r").read() txt=txt.lower() punctuation = ...

  7. hdu: 改革春风吹满地(叉乘求面积)

    Problem Description" 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简 ...

  8. little bug

    1 python script can be run in shell console while not in calling shell scripts wfile = codecs.open(n ...

  9. CentOS基本命令手册

    一.磁盘使用情况 两个命令df .du结合比较直观 df -h #查看整台服务器的硬盘使用情况 du -sh * #查看每个文件夹的大小 二.tar 用法 压缩 tar tar -czvf test. ...

  10. 4.3Dsmax捕捉工具

    平面视图: Line 线 多用于平面视图(按住shift可创建水平或垂直的线) Cirde 圆 Arc 弧形 NGon 多边形 Text 文本 输入中文会出现方框,换一下字体即可 Egg 鹅卵形 re ...