【问题标题】:Implement gradient descent in python在python中实现梯度下降
【发布时间】:2019-11-15 04:04:33
【问题描述】:

我正在尝试在 python 中实现梯度下降。虽然我的代码正在返回结果,但我认为我得到的结果是完全错误的。

这是我写的代码:

import numpy as np
import pandas

dataset = pandas.read_csv('D:\ML Data\house-prices-advanced-regression-techniques\\train.csv')

X = np.empty((0, 1),int)
Y = np.empty((0, 1), int)

for i in range(dataset.shape[0]):
  X = np.append(X, dataset.at[i, 'LotArea'])
  Y = np.append(Y, dataset.at[i, 'SalePrice'])

X = np.c_[np.ones(len(X)), X]
Y = Y.reshape(len(Y), 1)

def gradient_descent(X, Y, theta, iterations=100, learningRate=0.000001):
  m = len(X)
  for i in range(iterations):
    prediction = np.dot(X, theta)
    theta = theta - (1/m) * learningRate * (X.T.dot(prediction - Y))

  return theta

  theta = np.random.randn(2,1)
  theta = gradient_descent(X, Y, theta)
  print('theta',theta)

我运行这个程序后得到的结果是:

θ [[-5.23237458e+228] [-1.04560188e+233]]

这是非常高的价值。谁能指出我在实施中犯的错误。

另外,第二个问题是我必须将学习率的值设置得很低(在这种情况下我设置为 0.000001)才能正常工作,其他明智的程序会抛出错误。

请帮助我诊断问题。

【问题讨论】:

  • 这里的代码:github.com/0xPrateek/ML-Algorithms/blob/master/Algorithms/… 是自我解释的,虽然它是组件形式的实现,但有助于理解
  • 更改学习率出现什么错误
  • @0xPrateek RuntimeWarning:减法中遇到无效值
  • @0xPrateek 您提供的链接非常冗长。我正在尝试使用 numpy 进行向量计算的能力来实现梯度下降。这让事情变得简单多了。
  • theta = theta - (1/m) * learningRate * (X.T.dot(prediction - Y)) 行中,theta 是一维向量,而(1/m) * learningRate * (X.T.dot(prediction - Y)) 是单个值。虽然该操作在 numpy 中有效,但在数学中却毫无意义。

标签: python numpy machine-learning gradient-descent


【解决方案1】:

尝试通过迭代降低学习率,否则将无法达到最佳最低值。试试这个

import numpy as np
import pandas

dataset = pandas.read_csv('start.csv')

X = np.empty((0, 1),int)
Y = np.empty((0, 1), int)

for i in range(dataset.shape[0]):
  X = np.append(X, dataset.at[i, 'R&D Spend'])
  Y = np.append(Y, dataset.at[i, 'Profit'])

X = np.c_[np.ones(len(X)), X]
Y = Y.reshape(len(Y), 1)

def gradient_descent(X, Y, theta, iterations=50, learningRate=0.01):
  m = len(X)
  for i in range(iterations):
    prediction = np.dot(X, theta)
    theta = theta - (1/m) * learningRate * (X.T.dot(prediction - Y))
    learningRate/=10;

  return theta

theta = np.random.randn(2,1)
theta = gradient_descent(X, Y, theta)
print('theta',theta)

【讨论】:

    猜你喜欢
    • 2019-08-08
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2018-11-16
    • 2014-03-14
    相关资源
    最近更新 更多