线性回归:如何计算数据点与预测线的距离并新增Distance列
没问题,我来帮你一步步实现计算数据点到线性回归预测线的距离,并把结果存入Distance新列的需求!
步骤1:准备数据
首先我们先把你提供的样本数据整理成DataFrame(我补全了部分缺失的样本值,你可以根据实际数据调整):
# 构造你的数据样本 data = { 'Exam Results': [93, 94, 92, 88, 90], 'Hours Studied': [8.232795, 7.879095, 6.972698, 6.854017, 7.5] } df = pd.DataFrame(data)
步骤2:拟合线性回归模型
用sklearn的LinearRegression拟合你的数据:
# 定义特征(X)和目标变量(y) X = df[['Hours Studied']] y = df['Exam Results'] # 训练模型 model = LinearRegression() model.fit(X, y)
步骤3:计算垂直距离到回归线
这里要注意:垂直距离是指数据点到回归线的最短(垂直)距离,和常见的**纵向残差(实际值-预测值)**是不同的。我们用直线距离公式来计算:
对于回归线方程 y = m*x + b,点(x0, y0)到直线的垂直距离公式为:|m*x0 - y0 + b| / sqrt(m² + 1)
代码实现如下:
# 获取模型的斜率(m)和截距(b) m = model.coef_[0] b = model.intercept_ # 计算每个点的垂直距离并存入新列 df['Distance'] = np.abs(m * df['Hours Studied'] - df['Exam Results'] + b) / np.sqrt(m**2 + 1)
如果你其实需要的是纵向残差(也就是预测值和实际值的差的绝对值,很多场景下也会被误称为“距离”),可以用更简单的方式计算:
# 先计算预测值 df['Predicted Exam Results'] = model.predict(X) # 计算纵向残差 df['Vertical Residual'] = np.abs(df['Exam Results'] - df['Predicted Exam Results'])
步骤4:验证结果(可选)
我们可以用可视化来确认距离计算是否正确:
plt.scatter(df['Hours Studied'], df['Exam Results'], label='Data Points', color='blue') plt.plot(df['Hours Studied'], model.predict(X), color='red', label='Regression Line') # 绘制每个点到回归线的垂直距离线 for idx, row in df.iterrows(): x0 = row['Hours Studied'] y0 = row['Exam Results'] # 计算垂直线与回归线的交点 x_intersect = (x0 + m*(y0 - b)) / (1 + m**2) y_intersect = m * x_intersect + b plt.plot([x0, x_intersect], [y0, y_intersect], color='gray', linestyle='--') plt.xlabel('Hours Studied') plt.ylabel('Exam Results') plt.legend() plt.title('Data Points vs Regression Line (with Vertical Distances)') plt.show()
运行完这些代码后,你的DataFrame就会新增Distance列,里面就是每个数据点到回归线的垂直距离啦!
内容的提问来源于stack exchange,提问作者Mark Kennedy
相关产品推荐
相关产品推荐

