Penso che il tuo codice sia un po 'troppo complicato e ha bisogno di più struttura, perché altrimenti ti perderai in tutte le equazioni e operazioni. Alla fine questa regressione riduce a quattro operazioni:
- calcolare l'ipotesi h = X * theta
- Calcolare la perdita = h - y e forse il costo quadrato (perdita^2)/2m
- calcolare il gradiente = X' * perdita/m
- aggiornare i parametri di teta = theta - alfa * gradient
Nel tuo caso, credo che hai confuso con m
n
. Qui m
indica il numero di esempi nel set di allenamento, non il numero di funzioni.
Diamo uno sguardo alla mia variante del codice:
import numpy as np
import random
# m denotes the number of examples here, not the number of features
def gradientDescent(x, y, theta, alpha, m, numIterations):
xTrans = x.transpose()
for i in range(0, numIterations):
hypothesis = np.dot(x, theta)
loss = hypothesis - y
# avg cost per example (the 2 in 2*m doesn't really matter here.
# But to be consistent with the gradient, I include it)
cost = np.sum(loss ** 2)/(2 * m)
print("Iteration %d | Cost: %f" % (i, cost))
# avg gradient per example
gradient = np.dot(xTrans, loss)/m
# update
theta = theta - alpha * gradient
return theta
def genData(numPoints, bias, variance):
x = np.zeros(shape=(numPoints, 2))
y = np.zeros(shape=numPoints)
# basically a straight line
for i in range(0, numPoints):
# bias feature
x[i][0] = 1
x[i][1] = i
# our target variable
y[i] = (i + bias) + random.uniform(0, 1) * variance
return x, y
# gen 100 points with a bias of 25 and 10 variance as a bit of noise
x, y = genData(100, 25, 10)
m, n = np.shape(x)
numIterations= 100000
alpha = 0.0005
theta = np.ones(n)
theta = gradientDescent(x, y, theta, alpha, m, numIterations)
print(theta)
In un primo momento ho creato un piccolo insieme di dati casuali che dovrebbe assomigliare a questo:
Come potete vedere ho ha anche aggiunto la linea di regressione generata e la formula che è stata calcolata da Excel.
È necessario prestare attenzione all'intuizione della regressione utilizzando la discesa del gradiente. Mentre esegui un passaggio completo sui tuoi dati X, devi ridurre le perdite m di ogni esempio in un singolo aggiornamento del peso. In questo caso, questa è la media della somma sopra i gradienti, quindi la divisione di m
.
La prossima cosa che devi fare attenzione è tracciare la convergenza e regolare il tasso di apprendimento. Del resto dovresti sempre tenere traccia del costo di ogni iterazione, magari anche tracciarlo.
Se si esegue il mio esempio, il theta restituito sarà simile a questa:
Iteration 99997 | Cost: 47883.706462
Iteration 99998 | Cost: 47883.706462
Iteration 99999 | Cost: 47883.706462
[ 29.25567368 1.01108458]
che in realtà è abbastanza vicino alla equazione che è stato calcolato da Excel (y = x + 30). Si noti che quando abbiamo passato il bias nella prima colonna, il primo valore theta indica il peso di bias.
punto e virgola vengono ignorati in python e indentazione se fondamentale. –