GradientDescentForLinearRegression

看完吴恩达老师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

数据点也分布在直线附近

训练数据越多,迭代次数越多就越逼近真实值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值