【问题标题】:gradient descent using python numpy matrix class使用python numpy矩阵类的梯度下降
【发布时间】:2013-05-25 10:20:58
【问题描述】:

我正在尝试在 python 中实现单变量梯度下降算法。我尝试了很多不同的方法,但没有任何效果。以下是我尝试过的一个例子。我究竟做错了什么?提前谢谢!!!

from numpy import *

class LinearRegression:

  def __init__(self,data_file):
    self.raw_data_ref = data_file
    self.theta = matrix([[0],[0]])
    self.iterations = 1500
    self.alpha = 0.001


  def format_data(self):
    data = loadtxt(self.raw_data_ref, delimiter = ',')
    dataMatrix = matrix(data)
    x = dataMatrix[:,0]
    y = dataMatrix[:,1]
    m = y.shape[0]
    vec = mat(ones((m,1)))
    x = concatenate((vec,x),axis = 1)
    return [x, y, m]


  def computeCost(self, x, y, m):
    predictions = x*self.theta
    squaredErrorsMat = power((predictions-y),2)
    sse = squaredErrorsMat.sum(axis = 0)
    cost = sse/(2*m)
    return cost


  def descendGradient(self, x, y, m):
      for i in range(self.iterations):

          predictions = x*self.theta
          errors = predictions - y
          sumDeriv1 = (multiply(errors,x[:,0])).sum(axis = 0)
          sumDeriv2 = (multiply(errors,x[:,1])).sum(axis = 0)

          print self.computeCost(x,y,m)

          tempTheta = self.theta
          tempTheta[0] = self.theta[0] - self.alpha*(1/m)*sumDeriv1
          tempTheta[1] = self.theta[1] - self.alpha*(1/m)*sumDeriv2

          self.theta[0] = tempTheta[0]
          self.theta[1] = tempTheta[1]


      return self.theta



regressor = LinearRegression('ex1data1.txt')
output = regressor.format_data()
regressor.descendGradient(output[0],output[1],output[2])
print regressor.theta 

一点更新;我之前尝试过以更“矢量化”的方式来做,就像这样:

def descendGradient(self, x, y, m):
  for i in range(self.iterations):

      predictions = x*self.theta
      errors = predictions - y

      sumDeriv1 = (multiply(errors,x[:,0])).sum(axis = 0)
      sumDeriv2 = (multiply(errors,x[:,1])).sum(axis = 0)

      gammaMat = concatenate((sumDeriv1,sumDeriv2),axis = 0)
      coeff = self.alpha*(1.0/m)
      updateMatrix = gammaMat*coeff
      print updateMatrix, gammaMat


      jcost  = self.computeCost(x,y,m)
      print jcost
      tempTheta = self.theta
      tempTheta = self.theta - updateMatrix
      self.theta = tempTheta

  return self.theta

这导致了 [[-0.86221218],[ 0.88827876]] 的 theta。

【问题讨论】:

  • 您所说的“没有任何效果”到底是什么意思?当您尝试运行此代码时会发生什么?您认为哪里出了问题,您尝试了哪些方法来修复代码?
  • @Colin,非常感谢您的回复。我不知道为什么它不起作用,但我想到了以下情况:存储 theta 值的无关临时变量,错误的 return 语句,以及如下所示,未指定浮点数。根据我的编辑,我还尝试以更“矢量化”的方式实现它。

标签: python matrix numpy regression


【解决方案1】:

你有两个问题,都与浮点有关:

1. 像这样初始化你的 theta 矩阵:

self.theta = matrix([[0.0],[0.0]])


2.更改更新行,将(1/m)替换为(1.0/m):

tempTheta[0] = self.theta[0] - self.alpha*(1.0/m)*sumDeriv1
tempTheta[1] = self.theta[1] - self.alpha*(1.0/m)*sumDeriv2



在不相关的说明中:您的 tempTheta 变量是不必要的。

【讨论】:

  • 感谢杰里米的提示。我想到了无关的 tempTheta 变量,但我不确定。此外,使用小数告诉 python 使用浮点数并没有改变结果。我仍然没有让它工作......但不是因为缺乏尝试。我认为 theta 应该收敛到 [[-3.63029144],[1.16636235]]。再次感谢。
  • 进行上述更改并进行self.iterations = 15000 和self.alpha = 0.01 给了我[[-3.89578088] [ 1.19303364]] 的结果(使用Coursera 课程中的ex1data1.txt)。
猜你喜欢
  • 2016-07-21
  • 2013-07-21
  • 2017-02-19
  • 2016-01-16
  • 2013-10-13
  • 1970-01-01
  • 2018-03-28
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多