使用python numpy矩阵类的梯度下降
我试图用python实现单变量梯度下降算法。我尝试了很多不同的方法,但都没有效果。下面是我尝试过的一个例子。我做错了什么?提前感谢使用python numpy矩阵类的梯度下降,python,matrix,numpy,regression,Python,Matrix,Numpy,Regression,我试图用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.a
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]。您有两个问题,都与浮点有关:
1.像这样初始化θ矩阵:
self.theta = matrix([[0.0],[0.0]])
2.更改更新行,将
(1/m)
替换为(1.0/m)
:
另一个不相关的注意事项是:您的
testheta
变量是不必要的。您所说的“不工作”到底是什么意思?当您尝试运行此代码时会发生什么?你认为是什么地方出了问题?为了修复代码,你做了哪些尝试?@Colin,非常感谢你的回复。我不知道为什么它不起作用,但我想到了以下几点:存储θ值的无关临时变量、放错位置的return语句,以及如下所示,不指定浮点。根据我的编辑,我还尝试以更“矢量化”的方式实现它。谢谢jeremy提供的提示。一个无关的变量在我脑海中闪过,但我不确定。此外,使用小数告诉python使用浮点并没有改变结果。我还没有让它工作。。。但不是因为缺乏尝试。我认为θ应该收敛到[-3.63029144],[1.16636235]。再次感谢。进行上述更改并进行self.iterations=15000
和self.alpha=0.01
给了我一个[-3.89578088][1.19303364]
(使用Coursera课程中的ex1data.txt)的结果。
tempTheta[0] = self.theta[0] - self.alpha*(1.0/m)*sumDeriv1
tempTheta[1] = self.theta[1] - self.alpha*(1.0/m)*sumDeriv2