梯度下降:求线性回归

梯度下降的直线拟合

实现说明

给定若干个x,yx, yx,y并且求得一个最佳的y=ax+by = ax + by=ax+b,也就是二元一次方程组的解。

先放上给定的散点,以及求得的线性回归的直线的图片。

我个人认为,这里的梯度优化,就是通过一个关键式子loss=∑(ax+b−y)2loss = \sum(ax + b - y) ^{2}loss=(ax+by)2,通过求解这个凹函数来得到他的最小值从而实现整个线性回归方程的最优解,具体的实现就如下分析。

∂loss∂a=2x(ax+b−y)\frac{\partial{loss}}{\partial{a}} = 2x(ax + b - y)aloss=2x(ax+by)

∂loss∂b=2(ax+b−y)\frac{\partial{loss}}{\partial{b}} = 2(ax + b - y)bloss=2(ax+by)

由此我们每次梯度下降更新的a=a−∂loss∂a∗learning_ratea = a - \frac{\partial{loss}}{\partial{a}} * learning\_ratea=aalosslearning_rate

同样的每次梯度下降更新的b=b−∂loss∂b∗learning_rateb = b - \frac{\partial{loss}}{\partial{b}} * learning\_rateb=bblosslearning_rate

然后通过这个迭代更新去得到最优损失的losslossloss,同时a,ba, ba,b,也会在这个时候更新为最优值

PY‘S CODE

import torch
import numpy as np
import matplotlib.pyplot as pltx1 = np.array([1.1, 2.4, 2.4, 3.1, 2.2, 4.42, 5.43, 4.5, 5.28, 7.35, 10, 8.27, 12.6, 12.8, 9.69, 15.0, 13.69])
y1 = np.array([2.5, 1.7, 3, 4.0, 5.2, 6.53, 7.33, 8.7, 4.2, 5.8, 6.05, 8.05, 7.41, 8.89, 10.12, 9.72, 10.83])def calc_error(a, b, data):sum = 0for i in range(len(data)):x, y = data[i][0], data[i][1]sum += (a * x + b - y) ** 2return sum / (float)(len(data))def gradient_step(now_a, now_b, data, learning_rate):gradient_a, gradient_b = 0, 0for i in range(len(data)):x, y = data[i][0], data[i][1]gradient_a += 2 * x * (now_a * x + now_b - y)gradient_b += 2 * (now_a * x + now_b - y)gradient_a /= len(data)#取导数的平均值gradient_b /= len(data)new_a = now_a - learning_rate * gradient_anew_b = now_b - learning_rate * gradient_breturn [new_a, new_b]def algorithm(start_a, start_b, data, learning_rate, iterator_num):a, b = start_a, start_bfor i in range(iterator_num):a, b = gradient_step(a, b, data, learning_rate)return [a, b]def run():# 1.1, 2.4, 2.4, 3.1, 2.2, 4.42, 5.43, 4.5, 5.28, 7.35, 10, 8.27, 12.6, 12.8, 9.69, 15.0, 13.69# 2.5, 1.7, 3, 4.0, 5.2, 6.53, 7.33, 8.7, 4.2, 5.8, 6.05, 8.05, 7.41, 8.89, 10.12, 9.72, 10.83data = np.array([[1.100000, 2.500000], [2.400000, 1.700000], [2.400000, 3.000000],[3.100000, 4.000000], [2.200000, 5.200000], [4.420000, 6.530000],[5.430000, 7.330000], [4.500000, 8.700000], [5.280000, 4.200000],[7.350000, 5.800000], [10.000000, 6.050000], [8.270000, 8.050000],[12.600000, 7.410000], [12.800000, 8.890000], [9.690000, 10.120000],[15.000000, 9.720000], [13.690000, 10.830000]])a, b = 0, 0# for i in range(1, 6):#通过改变迭代次数,对比其答案,#     iterator_num = 10 ** i#     print("iterator_num is {0}".format(iterator_num))#     print("befor a:{0}, b:{1}, error{2}".format(a, b, calc_error(a, b, data)))#     a, b = algorithm(a, b, data, 0.0001, iterator_num)#     print("after a:{0}, b:{1}, error{2}".format(a, b, calc_error(a, b, data)))#     print("")a, b = algorithm(a, b, data, 0.001, 100000)#选了一个稍优的迭代次数,print("My's {0}, {1} Standard's {2}, {3}".format(a, b, 0.487713, 3.0308))print("")# for i in range(len(data)):#     print("Data's y : {0} My's y : {1} Standard's y : {2}".format(data[i][1], a * data[i][0] + b, 0.487713 * data[i][0] + 3.0308))#     print("")return [a, b]if __name__ == "__main__":plt.scatter(x1, y1, color = "red", label = "point")a, b = run()x = x1y = a * x + bplt.plot(x, y, label = "line")plt.legend(loc = "best")plt.show()# print("heloo, word")

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

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

相关文章

Codeforces Round #268 (Div. 1) C. Hack it! 数位dp + 构造数位

传送门 文章目录题意:思路:题意: 定义f(x)f(x)f(x)表示xxx的十进制下数位和,现在给你aaa,让你选一个区间[l,r][l,r][l,r],满足∑ilrf(i)moda0\sum_{il}^rf(i)\bmod a0∑ilr​f(i)moda0。 1≤a≤1e181\le a…

3分钟了解数据库事务

事务是由几个读取和修改数据的sql命令组成的,但是知道commit命令被执行之后,修改操作才被认为是正常的完成。显式事务常以Begin tran语句开头,以commit tran或者rollback tran语句结尾的。事务具有acid属性原子性(atomicity&#…

D. The Best Vacation(贪心+前缀和+二分)

The Best Vacation 思路 前缀和加贪心 贪心:我们的结尾点一定是在某一个月的最后一天。 贪心部分证明:我们选定两组数 Aan−2,an−1,an,b1,b2,b3……bn−2,bn−1A a_{n - 2}, a_{n - 1}, a_{n}, b_{1}, b_{2}, b_{3}……b_{n - 2}, b_{n - 1}Aan−2…

P4396 [AHOI2013]作业 cdq分治

传送门 文章目录题意:思路:题意: 给你一个长度为nnn的数列aaa,有qqq个询问,每次询问[l,r][l,r][l,r]中值域在[a,b][a,b][a,b]中的数出现的次数和在[a,b][a,b][a,b]中出现过的数值个数。 n≤1e5,1≤a≤1e5n\le1e5,1\le…

WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

NETCore提供了三种不同类型用于生产的REST API: HttpWebRequest;WebClient;HttpClient,开源社区创建了另一个名为RestSharp的库。如此多的http库,该怎样选择呢?01HttpWebRequest这是.NET创建者最初开发用于使用HTTP请求的标准类。…

树的直径与重心

树的直径与重心 或许更好的阅读体验 树的直径求解方法一 思路 先选取一个点rt作为根节点,dfs去找到一个最长路径的点U,然后通过这个点去dfs,找到路径最长的点V,U->V就是这课树的直径。 证明正确性: 假如rt在直…

Codeforces Round #446 (Div. 1) B. Gluttony 构造 + 补集思想

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数组aaa&#xff0c;保证aaa中每个数都互不相同&#xff0c;让你构造一个数组bbb&#xff0c;满足对于任意的Sx1,x2,...,xk,1≤xi≤n,0≤k<nS{x_1,x_2,...,x_k},1\le x_i\le n,0\le k< nSx1​…

.NetCore 2.1以后的HttpClient最佳实践

ASP.NET Core 2.1中出现一个新的HttpClientFactory功能&#xff0c;它有助于解决开发人员在使用HttpClient实例从其应用程序发出外部Web请求时可能遇到的一些常见问题。01介绍在.NETCore平台的2.1新增了HttpClientFactory&#xff0c;虽然HttpClient这个类实现了disposable&…

D. Multiset(树状数组 + 二分)

Multiset 可能更好的阅读体验 思路 二分 树状数组做法 我们发现每个数的范围是$ < 1e6$的&#xff0c;所以可以直接在线操作&#xff0c;不用离散化离线操作。 这个时候我们的treetreetree数组就相当与一个桶&#xff0c;每个桶里统计的是值为其下标的个数&#xff0c…

Codeforces Round #381 (Div. 1) A. Alyona and mex 构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 你需要确定一个长度为nnn的数组aaa&#xff0c;满足给定的mmm个[l,r][l,r][l,r]限制&#xff0c;需要保证构造出来的aaa数组对于每个[l,r][l,r][l,r]的mexmexmex最小值最大。 n,m≤1e5n,m\le1e5n,m≤1e5 思…

点分治(简要讲解 + 模板)

树上点分治 思想 两个点之间的距离无非就是两种关系&#xff1a;我们约定dis[i]dis[i]dis[i]表示这个点到当前根节点的距离 dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个根节点的不同子树上。dis[u]dis[v]dis[u] dis[v]dis[u]dis[v]&#xff0c;在同一个棵子…

在 alpine 中使用 NPOI

在 alpine 中使用 NPOIIntro在 .net 中常使用 NPOI 来做 Excel 的导入导出&#xff0c;NPOI 从 2.4.0 版本开始支持 .netstandard2.0&#xff0c;在 dotnet core 应用也可以用 DotNetCore.NPOI。对于 .NET Core 应用来说&#xff0c;如果没有特殊的需求&#xff0c;alpine 是最…

Educational Codeforces Round 16 C. Magic Odd Square 矩阵构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个奇数nnn&#xff0c;让你构造一个n∗nn*nn∗n的矩阵&#xff0c;矩阵的每个位置依次填上[1,n∗n]之内的数[1,n*n]之内的数[1,n∗n]之内的数&#xff0c;满足每行、每列、以及主对角线的和都是奇数。…

关于WCF、WebAPI、WebService之间的区别总结 分布式通信技术

早在1996年Gartner就前瞻性地提出了面向服务架构的思想(SOA)&#xff0c;SOA 的走红在很大程度上归功于 Web Service 标准的成熟和应用的普及。Service Oriented Ambiguity 中文一般理解为&#xff1a;面向服务架构&#xff0c;简称SOA&#xff0c;这个概念算得上微服务的鼻祖了…

LCA求解的四种模板

LCA求解的四种模板 或许更好的阅读体验 树剖在线求解LCA 思想 树剖这里就不多解释了&#xff0c;求解LCA的过程就是轻重链的跳转&#xff0c;跟树剖求任意两点间的距离一样的操作&#xff0c;只不过不用线段树去维护disdisdis了&#xff0c;那就直接上代码吧。 代码 #inc…

HDU - 1998 奇数阶魔方

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个奇数nnn&#xff0c;构造一个nnn阶幻方。 3≤n≤193\le n\le 193≤n≤19 思路&#xff1a; 模板题了&#xff0c;直接构造一个幻方即可。 首先在第一行中间放一个111&#xff0c;之后每次看一下(…

Azure 物联网开发者体验 7 月更新:边缘计算开发工具,ARM64 设备开发,VS Code 容器化开发工具...

欢迎来到 Azure 物联网开发者体验的 7 月更新&#xff01;在本次发布中&#xff0c;微软为物联网开发人员提供了许多新的功能和改进&#xff01;物联网边缘计算开发工具正式发布Azure IoT Edge 于 2017 年发布。随着近两年的对边缘计算开发工具的不断开发与改善&#xff0c;Azu…

Tarjan缩点

Tarjan缩点 或许更好的阅读体验 P3387 【模板】缩点 思路 既然时缩点的模板&#xff0c;那么缩点自然少不了了&#xff0c;缩点后我们的到新的有向无环图&#xff0c;然后再利用这个无环图去找一条最大权值的路径&#xff0c;路径和即为答案。 我们改如何选取起点来避免不…

.NET中的值类型与引用类型

.NET中的值类型与引用类型这是一个常见面试题&#xff0c;值类型(Value Type)和引用类型(Reference Type)有什么区别&#xff1f;他们性能方面有什么区别&#xff1f;TL;DR&#xff08;先看结论&#xff09;值类型引用类型创建位置栈托管堆赋值时复制值复制引用动态内存分配无需…

Canada Cup 2016 C. Hidden Word 字符串构造

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为272727的字符串sss&#xff0c;其中262626个字母每种都至少出现一次&#xff0c;让你构造一个213213213的矩阵&#xff0c;使得每个字母都出现一次&#xff0c;并且存在一条路径&#xff0c;经…