当前位置:   article > 正文

python实现一元线性回归方程_python 回归方程

python 回归方程

   利用最小二乘法,计算出一元线性回归方程,可以直接调用函数。但是自主实现更能理解其中的数学逻辑以及有效提高编程能力。这里采用的是t检验,数据来源于1990-2012年国内生产总值与成品刚才需求量的统计数据。代码主体用python来实现的,图片是用matlab实现的(个人感觉matlab做出来的图片呈现出来的效果更好一些)。

  1. import numpy as np
  2. from sympy import symbols, diff, solve
  3. from scipy import stats
  4. # 这里是在计算损失函数
  5. def function_2(a, b, x): # 定义一个函数,拿来储存a+bx,这里a和b是参数要最后求取的内容
  6. return a+b*x
  7. a, b, x, y = symbols('a b x y') # 利用symbols函数来表示变量a,b,x
  8. y1 = np.array([0.5153, 0.5638, 0.6697, 0.7716, 0.8428, 0.8980, 0.9338, 0.9979, 1.0738, 1.2110, 1.3146, 1.6068, 1.9252,
  9. 2.4108, 3.1976, 3.7771, 4.6893, 5.6561, 6.0460, 6.9405, 8.0277, 8.8620, 9.5578]) # 因变量数据
  10. x1 = np.array([1.8668, 2.1781, 2.6923, 3.5334, 4.8198, 6.0794, 7.1177, 7.8973, 8.4402, 8.9677, 9.9215, 10.9655, 12.0333,
  11. 13.5823, 15.9878, 18.4937, 21.6314, 26.5810, 31.4045, 34.0903, 40.1513, 47.3104, 51.8942]) #自变量数据
  12. e1 = function_2(a, b, x1) # 调用上文函数function_2用于储存a+b*x
  13. average_y = sum(y1)/len(y1)
  14. average_X = sum(x1)/len(x1)
  15. loss1 = (y1 - e1)**2 # 计算损失函数
  16. for term in loss1:
  17. print(term)
  18. loss_fun = loss1.sum() # 将前文的每一项的损失函数全部求和加起来
  19. # 这里是在求取偏导数并求得关于a和b的解
  20. y11 = diff(loss_fun, a) # 损失函数求导得到关于a的方程
  21. print(y11)
  22. y22 = diff(loss_fun, b) # 损失函数求导得到关于b的方程
  23. print(y22)
  24. solutions = solve([y11, y22], (a, b)) # 调用solve函数,求解得到关于a和b的值
  25. print("a =", solutions[a])
  26. print("b =", solutions[b])
  27. print('线性回归方程为')
  28. print(f"y = {solutions[b]}*x+{solutions[a]}") # 使用了Python中的f-string(格式化字符串)来输出线性回归方程。在这个字符串中,我们使用花括号 {} 来表示占位符,其中的表达式将会被替换为实际的值。
  29. # 这里进行显著性检验
  30. head_y = solutions[b]*x1+solutions[a] # 将x1带入回归方程,计算预测值
  31. print(head_y)
  32. SSR = sum((head_y-average_y)**2) # 表示回归平方和,用预测值减去平均值
  33. print('计算SSR')
  34. print(SSR)
  35. SSE = sum((y1-head_y)**2) # 表示残差平方和,用真实值减去预测值
  36. print('计算SSE')
  37. print(SSE)
  38. SST = SSE+SSR
  39. R = SSR/SST # 回归方程拟合度
  40. print('计算回归方程的拟合度')
  41. print(R)
  42. if solutions[b]>0:
  43. if R > 0.8:
  44. print("正相关,拟合程度高")
  45. elif 0.8 > R > 0.5:
  46. print('正相关,拟合程度一般')
  47. else:
  48. print('正相关,拟合程度较低')
  49. elif solutions[b] < 0:
  50. if R > 0.8:
  51. print("负相关,拟合程度高")
  52. elif 0.8 > R > 0.5:
  53. print('负相关,拟合程度一般')
  54. else:
  55. print('负相关,拟合程度较低')
  56. df = len(x1)-2 # 计算自由度
  57. t1 = sum((x1-average_X)**2)
  58. print('计算t1')
  59. print(t1)
  60. Lxx = pow(t1, 0.5)
  61. print('计算Lxx')
  62. print(Lxx)
  63. t_b = Lxx*solutions[b] / pow(SSE / df,0.5)
  64. print('计算回归系数b的t统计量')
  65. print(t_b)
  66. alpha = 0.05
  67. t_value = stats.t.isf(alpha/2, df) # 进行t检验,寻找对应的t值
  68. print('计算t检验上alpha/2分位点所在的值为')
  69. print(t_value)
  70. if abs(t_b) > t_value:
  71. print('拒绝原假设,即样本回归系数显著,表明存在线性关系')
  72. else:
  73. print('接受原假设,即样本回归系数不显著,不存在线性关系')

根据自己的需求,可以修改alpha。最后用matlab运行可以得到的图片是

  其实可以观看的R值出来这里的原始数据和回归直线,总体偏差不算太大。

  当然也可以在python中绘制图像,这个是个人习惯问题啦。至于理论部分,可以去看看网络上其他优秀博主的讲解,很多资源,这里就不再赘述了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/683666
推荐阅读
相关标签
  

闽ICP备14008679号