线性回归Python代码核心计算正常,需完成剩余功能开发与调试
完成线性回归剩余功能的实现与调试
看起来你已经搞定了线性回归里最关键的求和环节,接下来咱们把剩下的计算逻辑补上,让整个分析流程完整跑起来。先给你补上完整的代码,再一步步解释改动点:
from __future__ import division import math # 计算相关系数需要用到平方根 data = [[0.0,0.0], [1.0,2.0], [2.0,4.0]] n = float(len(data)) sumx = 0.0 sumy = 0.0 sumxsquared = 0.0 sumysquared = 0.0 # 新增:计算相关系数需要y的平方和 sumxy = 0.0 rcoeff = 0.0 m = 0.0 # 斜率 b = 0.0 # 截距 # 遍历数据计算各项求和值 i = 0 while i < n: x = data[i][0] y = data[i][1] sumx += x sumxsquared += x**2.0 sumysquared += y**2.0 # 新增:累加y的平方 sumxy += x*y sumy += y i += 1 # 打印基础求和结果(保留你原来的输出) print(f"数据点数量n: {n}") print(f"total x: {sumx}") print(f"total y: {sumy}") print(f"total x²: {sumxsquared}") print(f"total y²: {sumysquared}") print(f"total xy: {sumxy}") # 计算斜率m - 注意处理分母为0的情况(避免除以0错误) denominator_m = n * sumxsquared - sumx**2 if denominator_m == 0: print("警告:分母为0,无法计算斜率,数据可能存在共线性问题") else: m = (n * sumxy - sumx * sumy) / denominator_m # 计算截距b b = (sumy - m * sumx) / n # 计算相关系数r denominator_r = math.sqrt( (n*sumxsquared - sumx**2) * (n*sumysquared - sumy**2) ) if denominator_r == 0: rcoeff = 0.0 else: rcoeff = (n * sumxy - sumx * sumy) / denominator_r # 计算决定系数r²(更常用的拟合度指标) r_squared = rcoeff ** 2 # 打印回归结果 print("\n线性回归结果:") print(f"斜率m: {m:.4f}") print(f"截距b: {b:.4f}") print(f"相关系数r: {rcoeff:.4f}") print(f"决定系数r²: {r_squared:.4f}") print(f"回归方程:y = {m:.4f}x + {b:.4f}") # 示例:用回归方程预测x=3.0时的y值 x_pred = 3.0 y_pred = m * x_pred + b print(f"\n预测x={x_pred}时,y的预测值为:{y_pred:.4f}")
关键改动与说明:
- 新增
sumysquared变量:计算相关系数需要用到y的平方和,所以在循环里补上了累加逻辑。 - 导入
math模块:计算相关系数时需要平方根函数sqrt()。 - 斜率与截距的计算:严格按照线性回归的最小二乘公式实现,同时加了分母为0的判断,避免程序崩溃(比如所有x值都相同的极端情况)。
- 相关系数与决定系数:相关系数r衡量变量的线性相关程度,r²(决定系数)更直观,代表模型解释数据变异的比例。
- 结果可视化与预测示例:添加了回归方程打印和预测功能,让你能直接看到模型的实际作用。
调试注意点:
- 如果运行时出现
ZeroDivisionError,检查你的数据是不是所有x值都相同(比如所有数据点的x都是1.0),这种情况下无法计算斜率,需要检查数据合理性。 - 对于更复杂的数据集,你可以把
data换成自己的实际数据,代码逻辑完全通用。
内容的提问来源于stack exchange,提问作者Arran Robinson
相关产品推荐
相关产品推荐

