【问题标题】:Why isn't my gradient descent algorithm working?为什么我的梯度下降算法不起作用?
【发布时间】:2019-05-09 04:59:48
【问题描述】:

我在 Python 中做了一个梯度下降算法,但它不起作用。我的 m 和 b 值不断增加并且永远不会停止,直到我得到 -inf 错误或在平方错误中遇到溢出。

import numpy as np

x = np.array([2,3,4,5])

y = np.array([5,7,9,5])

m = np.random.randn()

b = np.random.randn()

error = 0

lr = 0.0001


for q in range(1000):

        for i in range(len(x)):
            ypred = m*x[i] + b
            error += (ypred - y[i]) **2
        m = m - (x * error) *lr
        b = b - (lr * error)
print(b,m)

我希望我的算法能够为我的数据(x 和 y)返回最佳的 m 和 b 值,但它不起作用。出了什么问题?

【问题讨论】:

  • 看来您使用的公式不正确。
  • 什么是正确的公式,你有解释我的代码为什么不起作用的原因吗?
  • 如果我没记错你忘了除以x的长度

标签: python python-3.x machine-learning linear-regression gradient-descent


【解决方案1】:
import numpy as np

x = np.array([2,3,4,5])
y = 0.3*x+0.6


m = np.random.randn()
b = np.random.randn()


lr = 0.001

for q in range(100000):
    ypred = m*x + b 
    error = (1./(2*len(x))) * np.sum(np.square(ypred - y)) #eq 1
    m = m - lr * np.sum((ypred - y)*x)/len(x) # eq 2 and eq 4
    b = b - lr * np.sum(ypred - y)/len(x)   # eq 3 and eq 5

print (m , b)

输出:

0.30007724168011807 0.599703981757188​​1

背后的数学

使用 numpy 向量化操作来避免循环。

【讨论】:

  • 感谢您的帮助!
【解决方案2】:

我认为您错误地执行了公式:

  • x - error上使用求和
  • 除以x的长度

见以下代码:

import numpy as np

x = np.array([2,3,4,5])

y = np.array([5,7,9,11])

m = np.random.randn()

b = np.random.randn()

error = 0

lr = 0.1
print(b, m)

for q in range(1000):
  ypred = []
  for i in range(len(x)):
    temp = m*x[i] + b
    ypred.append(temp)
    error += temp - y[i]
  m = m - np.sum(x * (ypred-y)) *lr/len(x)
  b = b - np.sum(lr * (ypred-y))/len(x)
print(b,m)

输出:

-1.198074371762264 0.058595039571115955   # initial weights
0.9997389097653074 2.0000681277214487     # Final weights

【讨论】:

  • 您的参数更新错误。它们也不是真正的值,它们只是一些随机初始化,GD 应该微调最适合数据的参数。
猜你喜欢
  • 2018-07-17
  • 2014-12-27
  • 1970-01-01
  • 2016-06-13
  • 2019-12-16
  • 2019-06-21
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多