看完吴恩达老师1-12课后,学会了使用梯度下降算法解决线性回归问题,以下用python实现单变量的线性回归问题
首先先来回顾最重要的公式如下图,这条公式是梯度下降算法的权重更新公式,通过这条公式我们可以不断更新两个权重参数,最终达到局部最小值,即使我们的损失函数值达到最小。
接下来使用python实现,主要流程如下:
1.生成两个随机数组x,y作为训练集,x是输入,y是输出。在这里我设置函数为y = 3*x + 1
2.初始化学习速率,样本数,两个权重参数和迭代次数
3.在迭代次数内,使用梯度下降算法对两个权重参数进行更新,逼近局部最小值
4.得出结果
import numpy as np
max_epoh = 100000
sample = 20
learning_rate = 0.001
alpha = np.longlong(0)
beta = np.longlong(0)
def f(x):
return 3*x+1;
def gradient_descent(alpha,beta,x,y):
sum0 = np.longlong(0)
sum1 = np.longlong(0)
for i in range(0,sample,1):
sum0 =sum0 + (alpha * x[i] + beta - y[i]) * x[i] / sample * learning_rate
sum1 =sum1 + (alpha * x[i] + beta - y[i]) / sample * learning_rate
temp0 = alpha - sum0
temp1 = beta - sum1
return temp0,temp1
#y = alpha * x + beta
y = np.zeros(sample)
np.random.seed(0)
x = np.random.randint(1,30,sample)
x = x.astype(float)
for i in range(0,sample,1):
y[i] = f(x[i])
print(x)
print(y)
for epoh in range(0,max_epoh,1):
alpha,beta = gradient_descent(alpha,beta,x,y)
print(alpha,beta)
最终得到结果
[13. 16. 22. 1. 4. 28. 4. 8. 10. 20. 22. 19. 5. 24. 7. 25. 25. 13.
27. 2.]
[40. 49. 67. 4. 13. 85. 13. 25. 31. 61. 67. 58. 16. 73. 22. 76. 76. 40.
82. 7.]
3.000000000000114 0.9999999999977132
另外我们通过plt画图可以得到结果:
但是作为输出的训练集y是根据输入训练集x和正确函数得到的,因此会在直线上,尝试将数据集y存在误差,看看结果会怎么样。
#改变输出训练集y,使其存在误差
def f(x):
return 3*x+np.random.randn(1);
根据训练后发现,权重参数基本没什么影响
[13. 16. 22. 1. 4. 28. 4. 8. 10. 20. 22. 19. 5. 24. 7. 25. 25. 13.
27. 2.]
[39.14404357 49.45427351 66.76103773 3.12167502 12.44386323 84.33367433
13.49407907 23.79484174 30.3130677 59.14590426 63.44701018 57.6536186
15.8644362 71.25783498 23.26975462 73.54563433 75.04575852 38.81281615
82.53277921 7.46935877]
2.950640833276106 1.0233207947071592
数据点也分布在直线附近
训练数据越多,迭代次数越多就越逼近真实值。