最近在看吴恩达的机器学习入门课(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