Можно, например, так:
def stochastic_gradient_step(X, y, w, train_ind, eta=0.01):
l=len(y)
return w+(2*eta*X[train_ind]/l)*(y[train_ind]-sum((xi*wi) for xi,wi in zip(X[train_ind],w)))
Если я правильно понимаю, какую именно задачу вы решаете :)
Но у меня похожая проблема - градиентный спуск работает, полученный вектор весов - "похож на правду", функция среднеквадратичной ошибки реализована верно. Но ответ - не подходит!