【机器学习①】线性回归+多项式回归

120 阅读4分钟

有一些前置知识比较简单,就不累述了。

今天说一下scipy包

SciPy(Scientific Python)是一个用于科学计算和数据分析的开源Python库,它建立在NumPy库的基础上,提供了更多的功能和工具,用于处理科学和工程领域的各种问题。SciPy涵盖了许多数学、科学和工程领域的功能,包括优化、信号处理、统计分析、线性代数、插值、数值积分、图像处理等。

以下是SciPy库中一些常见模块和功能的简要介绍:

  1. 数学优化(scipy.optimize) :提供了各种优化算法,用于寻找函数的最小值或最大值,包括非线性最小二乘法、全局优化、约束优化等。
  2. 信号处理(scipy.signal) :提供了信号处理相关的函数,包括滤波、傅里叶变换、谱分析、卷积等。
  3. 统计分析(scipy.stats) :提供了多种统计分析工具,包括概率分布、假设检验、回归分析、描述性统计等。
  4. 插值(scipy.interpolate) :提供了各种插值算法,用于在已知数据点之间进行数据估计,如线性插值、样条插值等。
  5. 线性代数(scipy.linalg) :提供了线性代数相关的函数,包括矩阵运算、特征值计算、SVD分解等。
  6. 数值积分(scipy.integrate) :提供了数值积分的方法,包括定积分、数值微分等。
  7. 图像处理(scipy.ndimage) :提供了图像处理相关的函数,包括图像过滤、形态学操作、图像变换等。
  8. 空间距离和坐标转换(scipy.spatial) :提供了空间距离计算和坐标转换的功能。
  9. 稀疏矩阵(scipy.sparse) :提供了处理稀疏矩阵的方法,用于在节省内存的同时进行线性代数计算。

线性回归

import matplotlib.pyplot as plt
from scipy import stats

x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]

slope, intercept, r, p, std_err = stats.linregress(x, y)

def myfunc(x):
  return slope * x + intercept

mymodel = list(map(myfunc, x))

plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()

重点语句,slope, intercept, r, p, std_err = stats.linregress(x, y)

x,y就是散点图,找出线性回归的曲线,

  1. slope(斜率):这个变量表示线性回归线的斜率,即回归线的倾斜程度。斜率代表了自变量(x)的单位变化引起因变量(y)的变化。
  2. intercept(截距):这个变量表示线性回归线与y轴的交点,即当自变量(x)为0时,对应的因变量(y)的值。它表示了回归线在y轴上的偏移。
  3. r(相关系数):这个变量表示Pearson相关系数,它衡量了x和y之间的线性关系的强度和方向。取值范围为-1到1,越接近1表示正相关,越接近-1表示负相关,越接近0表示没有线性关系。
  4. p(p值):这个变量表示线性回归分析的假设检验的p值。p值用于判断斜率是否显著不等于零,从而判断回归线是否能够有效地拟合数据。
  5. std_err(标准误差):这个变量表示回归线的标准误差,即回归线与真实数据之间的平均偏差。标准误差越小,表示回归线对数据的拟合程度越好。

根据斜率和截距就可以画出直线了。

image.png


多项式回归(Polynomial Regression)

import matplotlib.pyplot as plt

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]

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

myline = numpy.linspace(1, 22, 100)

plt.scatter(x, y)
plt.plot(myline, mymodel(myline))
plt.show()

核心语句: NumPy 有一种方法可以让我们建立多项式模型:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
  1. numpy.polyfit(x, y, 3):这个函数用于在给定的数据点 (x, y) 上进行多项式拟合。它的参数包括数据点的x值列表 x、对应的y值列表 y,以及指定要拟合的多项式次数,这里是 3,表示拟合一个三次多项式。
  2. numpy.poly1d(...):这个函数将多项式系数转换为一个多项式对象,以便于进行多项式运算。它接受拟合多项式的系数作为参数,然后创建一个多项式对象。

问题,这里为什么要三次多项式,而不是二次呢。

回答:选择三次多项式拟合的主要基于尝试和实验,以及对数据拟合的预期形状。

然后指定行的显示方式,我们从位置 1 开始,到位置 22 结束:

myline = numpy.linspace(1, 22, 100)

numpy.linspace(start, stop, num) 是一个函数,用于生成一个等间隔的数值序列。具体来说:

  • start:起始值。
  • stop:终止值。
  • num:生成的样本数量,即要生成的序列中的元素个数。

计算相关度:

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]

mymodel = numpy.poly1d(numpy.polyfit(x, y, 2))
print(r2_score(y, mymodel(x)))