【发布时间】:2017-07-17 07:49:03
【问题描述】:
我正在尝试在 python 中编写梯度下降函数,作为多元线性回归练习的一部分。它运行,但不计算正确答案。我的代码如下。我已经尝试了几个星期来完成这个问题,但进展为零。
我相信我理解梯度下降的概念以优化多元线性回归函数,并且“数学”是正确的。我相信错误在我的代码中,但我仍在学习 python。非常感谢您的帮助。
def regression_gradient_descent(feature_matrix,output,initial_weights,step_size,tolerance):
from math import sqrt
converged = False
weights = np.array(initial_weights)
while not converged:
predictions = np.dot(feature_matrix,weights)
errors = predictions - output
gradient_sum_squares = 0
for i in range(len(weights)):
derivative = -2 * np.dot(errors[i],feature_matrix[i])
gradient_sum_squares = gradient_sum_squares + np.dot(derivative, derivative)
weights[i] = weights[i] - step_size * derivative[i]
gradient_magnitude = sqrt(gradient_sum_squares)
print gradient_magnitude
if gradient_magnitude < tolerance:
converged = True
return(weights)
特征矩阵为:
sales = gl.SFrame.read_csv('kc_house_data.csv',column_type_hints = {'bathrooms':float, 'waterfront':int, 'sqft_above':int, 'sqft_living15':float,'grade':int, 'yr_renovated':int, 'price':float, 'bedrooms':float, 'zipcode':str,'long':float, 'sqft_lot15':float, 'sqft_living':float, 'floors':str, 'condition':int,'lat':float, 'date':str, 'sqft_basement':int, 'yr_built':int, 'id':str, 'sqft_lot':int,'view':int})
我将函数调用为:
train_data,test_data = sales.random_split(.8,seed=0)
simple_features = ['sqft_living']
my_output= 'price'
(simple_feature_matrix, output) = get_numpy_data(train_data, simple_features, my_output)
initial_weights = np.array([-47000., 1.])
step_size = 7e-12
tolerance = 2.5e7
simple_weights = regression_gradient_descent(simple_feature_matrix, output,initial_weights,step_size,tolerance)
**get_numpy_data 只是一个将所有内容转换为数组并按预期工作的函数
更新:我将公式修正为:
derivative = 2 * np.dot(errors,feature_matrix)
它似乎奏效了。这个公式的推导在我的在线课程中用到了
-2 * np.dot(errors,feature_matrix)
我不确定为什么这个公式没有提供正确的答案。
【问题讨论】:
-
您能否举一个使用示例,包括实际输出与预期输出?
-
另外,如果您可以提供一些输入,例如您的特征矩阵的样子,那将非常有帮助。
-
你是怎么调用这个函数的?
-
感谢您的回复:我不确定输出是否正确。特征矩阵是房屋销售数据。行中有数千栋房屋,列中有特征/输入(平方英尺、# 浴室等)。我编辑了原始问题并提供了更多信息。
-
您使用哪个参考来确定应该使用
derivative = -2 * np.dot(errors[i],feature_matrix[i])来更新weights?据我所知,我们通常使用错误来更新权重/系数,如tutorial 所示
标签: python regression gradient-descent