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]] になりました。