def gradient(X_norm,y,theta,alpha,m,n,num_it):
temp=np.array(np.zeros_like(theta,float))
for i in range(0,num_it):
h=np.dot(X_norm,theta)
#temp[j]=theta[j]-(alpha/m)*( np.sum( (h-y)*X_norm[:,j][np.newaxis,:] ) )
temp[0]=theta[0]-(alpha/m)*(np.sum(h-y))
temp[1]=theta[1]-(alpha/m)*(np.sum((h-y)*X_norm[:,1]))
theta=temp
return theta
X_norm,mean,std=featureScale(X)
#length of X (number of rows)
m=len(X)
X_norm=np.array([np.ones(m),X_norm])
n,m=np.shape(X_norm)
num_it=1500
alpha=0.01
theta=np.zeros(n,float)[:,np.newaxis]
X_norm=X_norm.transpose()
theta=gradient(X_norm,y,theta,alpha,m,n,num_it)
print theta
字符串
上面代码中的theta是100.2 100.2
,但在matlab中应该是100.2 61.09
,这是正确的。
6条答案
按热度按时间iqih9akk1#
我认为你的代码有点太复杂了,它需要更多的结构,因为否则你会迷失在所有的方程和运算中。最后,这个回归归结为四个运算:
1.计算假设h = X * θ
1.计算损失= h - y,也许是成本的平方(损失^2)/2 m
1.计算梯度= X' * 损失/ m
1.更新参数theta = theta - alpha * gradient
在你的例子中,我猜你混淆了
m
和n
。这里m
表示训练集中的样本数量,而不是特征的数量。让我们来看看我的代码变体:
字符串
首先,我创建一个小的随机数据集,它应该看起来像这样:
x1c 0d1x的数据
正如你所看到的,我还添加了生成的回归线和Excel计算的公式。
你需要注意使用梯度下降回归的直觉。当你对数据X进行一个完整的批处理时,你需要将每个例子的m损失减少到一个单一的权重更新。在这种情况下,这是梯度总和的平均值,因此除以
m
。接下来你需要注意的是跟踪收敛和调整学习率,为此你应该总是跟踪每次迭代的成本,甚至可能绘制它。
如果你运行我的例子,返回的theta看起来像这样:
型
这实际上非常接近excel计算的公式(y = x + 30)。注意,当我们将偏倚传递到第一列时,第一个theta值表示偏倚权重。
643ylb082#
下面你可以找到我对线性回归问题的梯度下降的实现。
首先,你计算像
X.T * (X * w - y) / N
这样的梯度,并同时用这个梯度更新你当前的theta。下面是Python代码:
字符串
100d 1xx 1c 1d 1xx 1c 2d 1x的字符串
sirbozc53#
这些答案中的大多数都遗漏了一些关于线性回归的解释,并且代码有点复杂。
问题是,如果你有一个“m”个样本的数据集,每个样本称为“x^i”(n维向量),一个结果向量y(m维向量),你可以构造以下矩阵:
x1c 0d1x的数据
现在,目标是找到“w”(n+1维向量),它描述了线性回归的直线,“w_0”是常数项,“w_1”等是输入样本中每个维度(特征)的系数。所以本质上,你想找到“w”,使得“X*w”尽可能接近“y”,也就是说,你的线预测将尽可能接近原始结果。
还要注意的是,我们在每个“x^i”的开头添加了一个额外的分量/维度,它只是“1”,以说明常数项。此外,“X”只是通过将每个结果“堆叠”为一行而得到的矩阵,因此它是一个(m × n+1)矩阵。
一旦你构建了它,用于梯度下降的Python和Numpy代码实际上非常简单:
字符串
瞧!这将返回向量“w”,或者说是对预测线的描述。
**但它是如何工作的?**在上面的代码中,我正在寻找成本函数的梯度向量(在这种情况下,平方差),然后我们将“逆流”,以找到最佳“w”给出的最小成本。实际使用的公式在行中
型
有关完整的数学解释,以及包括创建矩阵的代码,请参阅how to implement gradient descent in Python上的这篇文章。
编辑:为了说明,上面的代码估计了一条线,您可以使用它来进行预测。下图显示了“学习”的梯度下降线(红色)的示例,以及来自Kaggle的“鱼市场”数据集的原始数据样本(蓝色散点)。
的
v09wglhw4#
我知道这个问题已经得到了回答,但我对GD功能做了一些更新:
字符串
这个函数在迭代过程中减少了alpha,使函数收敛得更快,参见R中的Estimating linear regression with Gradient Descent (Steepest Descent)示例。我在Python中应用了相同的逻辑。
vc9ivgsu5#
在@thomas-jungblut的python实现之后,我对Octave也做了同样的事情。如果你发现什么问题,请告诉我,我会修复+更新。
数据来自具有以下行的txt文件:
把它看作是一个非常粗略的样本,用于特征[卧室数量] [MTS 2]和最后一列[租金价格],这是我们想要预测的。
以下是Octave的实现:
字符串
bq3bfh9z6#
here显示了
autograd
的GD &与sklearn
的解决方案相比,* 稳健线性回归 *字符串