首页 > 其他 > 详细

使用线性回归的梯度下降法拟合数据

时间:2020-03-28 00:13:25      阅读:90      评论:0      收藏:0      [点我收藏+]

最近在看吴恩达的机器学习入门课(https://www.bilibili.com/video/BV164411b7dx

于是自己yy了一个十分不靠谱的使用线性回归的梯度下降法来拟合数据,只用了二次函数,所以不会出现过拟合的情况。

用python实现:

 1 import numpy as np
 2 import math
 3 
 4 m = int(input())//输入数据组数,用[xi,yi]表示第i组数据
 5 
 6 data = np.empty((m,3))用来存放1,xi,xi*xi,来进行矩阵乘法,代替函数h(x)的计算,因为用矩阵乘法的效率更高。
 7 res = np.empty((m,1))存放yi
 8 par = np.empty((3,1))存放参数,起始参数默认为都0。
 9 cal = np.empty((m,1))
10 
11 for i in range(m):
12     x = int(input())//输入数据
13     y = int(input())
14     data[i][0] = 1
15     data[i][1] = x
16     data[i][2] = x * x
17     res[i][0] = y
18 
19 def j(x):
20     sum = 0
21     for i in range(m):
22         sum += math.pow(data[i][1],x) * (cal[i][0] - res[i][0])//最终的sum为代价函数的导函数值。
23     return (2 * sum) / m
24 
25 def juedui(x):
26     if(x > 0):
27         return x
28     return -x
29 
30 a = float(input())//输入学习率
31 eps = float(input())输入迭代终止判断数
32 
33 change = eps+1
34 while change > eps://每次迭代记录最大的参数改变量,当小于eps即参数趋于稳定时退出循环。
35     cal = np.matmul(data,par)
36     change = 0
37     for i in range(3):
38         tmp = a * j(i)
39         change = max(change,juedui(tmp))
40         par[i][0] -= tmp
41 
42 print(par[0][0],par[1][0],par[2][0])//输出最终的参数取值。
43 print(np.matmul(data,par))//输出预测函数的结果。

测试数据1:

[0,0],[1,1],[2,2],[3,2],[4,1]

α=0.001 eps=0.0000001

结果:

-0.11391164864940378 1.7280941947476498 -0.3570395930272859

[[-0.11391165]

 [ 1.25714295]

 [ 1.91411837]

 [ 1.8570146 ]

 [ 1.08583164]]

 

测试数据2:

[-1,-1],[0,0],[1,-1],[2,0],[3,5],[4,3]

α=0.001 eps=0.0000001

结果:

-0.6499050007303273 0.5463254276582001 0.16073492146610105

[[-1.03549551]

 [-0.649905  ]

 [ 0.05715535]

 [ 1.08568554]

 [ 2.43568558]

 [ 4.10715545]]

貌似还行。

技术分享图片

 

使用线性回归的梯度下降法拟合数据

原文:https://www.cnblogs.com/liaxiaoquan/p/12584765.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!