#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/7/30 10:46
# @Author : lH.wu
# linear regression 线性回归测试
import matplotlib.pyplot as plt
from scipy import stats
# 横坐标值和纵坐标值
xl = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
yl = [99, 86, 87, 88, 111, 86, 103, 87, 94, 78, 77, 85, 86]
# 单独绘制散点图
# plt.scatter(xl, yl)
# plt.show()
# m 的值就是斜率(slope),b的值就是截距(intercept) 计算关系 y=mx+b
# R-Squared
# 重要的是要知道 x 轴的值和 y 轴的值之间的关系有多好,如果没有关系,则线性回归不能用于预测任何东西。
# 该关系用一个称为 r 平方(r-squared)的值来度量。
# r 平方值的范围是 0 到 1,其中 0 表示不相关,而 1 表示 100% 相关。
# Python 和 scipy 模块将为您计算该值,您所要做的就是将 x 和 y 值提供给它:
slope, intercept, r, p, std_err = stats.linregress(xl, yl)
print(r) # -0.758591524376155 说明有7成关系,关系还是很强的,非强关系的时候就要使用多项式回归
# 此时斜率本身可以看作
# 定义这个线性关系
def my_fun(x):
return slope * x + intercept
# 通过函数计算y列表值函数
my_model = list(map(my_fun, xl))
# 散点图
plt.scatter(xl, yl)
# 回归线图
plt.plot(xl, my_model)
# 绘制
plt.show()
# 此时可以通过函数my_fun预测用x值预测y值
print(my_fun(10)) # 85.59308314937454
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2020/7/30 11:45
# @Author : lH.wu
# Polynomial Regression多项式回归
import matplotlib.pyplot as plt
import numpy
from sklearn.metrics import r2_score
x = [1, 2, 3, 5, 6, 7, 8, 9, 10, 12, 13, 14, 15, 16, 18, 19, 21, 22]
y = [100, 90, 80, 60, 60, 55, 60, 65, 70, 70, 75, 76, 78, 79, 90, 99, 99, 100]
# polyfit的第三个参数时阶数,一般来说,理论上是越大越精确,高阶包括了低阶 但是当你取的很大时 高阶的系数基本无限接近于0 就没有这个必要了
# 所以,一般自己多测几次,选最合适的[一阶就是一条单项回归线,二阶抛物线,。。。]
# polyfit获取每一阶的参数,poly1d把参数组成多项式方程
model = numpy.poly1d(numpy.polyfit(x, y, 3))
# 继续使用 r-squared来度量x和y关系,同时测试设置的阶数合不合理
# 4阶 :0.9542030834699506
# 3阶 :0.9432150416451025
# 2阶 :0.7597771601895889
# 1阶 :0.18231625879420676
print(r2_score(y, model(x)))
# 在1-22范围内均匀的生成100个数
line = numpy.linspace(1, 22, 100)
plt.scatter(x, y)
plt.plot(line, model(line))
plt.show()