我有一个房屋销售数据集,在那上面,我正在应用线性回归。得到斜率和y截距后,我绘制图形并计算成本,得到的结果对我来说有点奇怪,因为
这是绘制直线的代码
def plotLine(slope, yIntercept, X, y):
abline_values = [slope * i + yIntercept for i in X]
plt.scatter(X, y)
plt.plot(X, abline_values, 'black')
plt.title(slope)
plt.show()
以下是计算费用的功能
def computeCost(m, parameters, x, y):
[yIntercept, slope] = parameters
hypothesis = yIntercept - np.dot(x, slope)
loss = hypothesis - y
cost = np.sum(loss ** 2) / (2 * m)
return cost
下面的代码行给出了x与y的关系图,其中包含来自计算参数的行(为简化此问题,我手动设置了参数)和成本值。
yIntercept = -70000
slope = 0.85
print("Starting gradient descent at b = %d, m = %f, error = %f" % (yIntercept, slope, computeCost(m, parameters, X, y)))
plotLine(slope, yIntercept, X, y)
以上代码段的输出为
所以,我的问题是:
1。这是在x与y上绘制直线的正确方法吗?
2。为什么成本值太大,并且即使参数很好地拟合了数据,成本值也可能这么大。
编辑1
打印语句中的m是斜率值而不是X的大小,即len(X)
答案 0 :(得分:2)
1。。您的绘制方式似乎正确,您可以简化
abline_values = [slope * i + yIntercept for i in X]
到
abline_values = slope * X + yIntercept
2。。您是否在示例中设置了m=0.85
?看起来是这样,但由于您未提供对cost函数的调用,因此我无法确定。不应该是样本的大小吗?如果将所有平方误差相加并除以2 * 0.85,则误差的大小取决于样本量。而且由于这不是相对误差,而且值很大,因此所有这些误差可能加起来就是这个巨大的数字。尝试将m设置为样本的大小。
另外,假设值的计算符号中有误差,应该为+。否则,您将具有负斜率,这也说明了较大的误差。
def computeCost(parameters, x, y):
[yIntercept, slope] = parameters
hypothesis = yIntercept + np.dot(x, slope)
loss = hypothesis - y
cost = np.sum(loss ** 2) / (2 * len(x))
return cost
答案 1 :(得分:0)
由于输入数据未标准化,因此错误值很大。根据您的代码,x
从0到250k不等。在这种情况下,建议您将x
标准化为[0,1]。这样,我希望损失很小,学习的参数(斜率和截距)也很小。