2022年 11月 8日

python 线性相关 与 线性拟合

文章目录

    • 线性相关
      • 皮尔逊相关系数(stats.pearsonr)
      • 斯皮尔曼相关系数(stats.spearmanr)
    • 线性拟合/回归
      • 最小二乘法(optimize.least_squares)
      • R方(sklearn.metrics.r2_score)
        • 代码实现
    • 区别与联系
      • 区别

线性相关

线性相关分析是描述两变量间直线相关,常用相关系数来描述。
根据数据的分布特性不同可以分为:皮尔逊相关系数(Pearson correlation coefficient )和斯皮尔曼相关系数(Spearman‘s rank correlation coefficient )

皮尔逊相关系数(stats.pearsonr)

适用条件:变量需要满足正态分布
计算表达式:

r

=

(

x

m

x

)

(

y

m

y

)

(

x

m

x

)

2

(

y

m

y

)

2

r=\frac{\sum\left(x-m_{x}\right)\left(y-m_{y}\right)}{\sqrt{\sum\left(x-m_{x}\right)^{2} \sum\left(y-m_{y}\right)^{2}}}

r=(xmx)2(ymy)2
(xmx)(ymy)

pytho代码,两个返回值,分别返回:相关系数和pvalue。pvalue空假设是两变量相关系数为0,pvalue越小越拒绝原假设,故越线性相关

from scipy import stats
a = np.array([0, 0, 0, 1, 1, 1, 1])
b = np.arange(7)
stats.pearsonr(a, b)
  • 1
  • 2
  • 3
  • 4

参考
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html#scipy.stats.pearsonr

斯皮尔曼相关系数(stats.spearmanr)

适用条件:非参数估计方法,适用于任何分布的数据
计算表达式与pearson,但是需要注意:分布x和y是排序后的编号(秩),非原始数据。计算示例

from scipy import stats
a = np.array([0, 0, 0, 1, 1, 1, 1])
b = np.arange(7)
stats.spearmanr(a, b)
  • 1
  • 2
  • 3
  • 4

线性拟合/回归

定量描述两个变量间依存关系的统计分析方法。
适用条件:

  1. 两变量变化关系呈线性趋势;
  2. 每个数据样本之间相互独立;
  3. X和Y服从正态分布;

求线性回归方程主要依据最小二乘法(least square method)

最小二乘法(optimize.least_squares)

在曲线拟合问题中, 使得剩余平方和(residual sum of squares)

S

S

r

e

s

=

i

(

y

i

f

i

)

2

SS_{\mathrm{res}}=\sum_{i}\left(y_{i}-f_{i}\right)^{2}

SSres=i(yifi)2最小的方法。

f

i

f_{i}

fi为线性函数时,称为线性最小二乘问题;对于线性问题,可以直接通过线性方程组求出使得

S

S

r

e

s

SS_{\mathrm{res}}

SSres最小的系数。

f

i

f_{i}

fi为非线性函数时,称为非线性最小二乘问题。对非线性问题据需要适用不同的优化算法(梯度下降等)进行求解。

这里注意最小二乘法可以看作是求解回归问题的一个loss值

https://en.wikipedia.org/wiki/Least_squares

python代码实现(optimize.least_squares)

from scipy.optimize import least_squares
#待拟合的表达式, x表示待拟合系数,t自变量,y因变量
def fun(x, t, y):
    return x[0] + x[1] * np.exp(x[2] * t) - y
#初始参数
x0 = np.array([1.0, 1.0, 0.0])

res_lsq = least_squares(fun, x0, args=(t_train, y_train))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

res_lsq.x返回待拟合系数

scipy参考

R方(sklearn.metrics.r2_score)

注意并不是相关系数的平方
学术名词,决定系数(Coefficient of determination),一个统计量用来评价模型预测量与观测值的变异(variation)
计算表达式:

R

2

=

1

S

S

res 

S

S

tot 

R^{2}=1-\frac{S S_{\text {res }}}{S S_{\text {tot }}}

R2=1SStot SSres 
式中,剩余平方和

S

S

r

e

s

=

i

(

y

i

f

i

)

2

SS_{\mathrm{res}}=\sum_{i}\left(y_{i}-f_{i}\right)^{2}

SSres=i(yifi)2
总的平方和

S

S

t

o

t

=

(

y

i

y

ˉ

)

2

S S_{\mathrm{tot}}=\sum\left(y_{i}-\bar{y}\right)^{2}

SStot=(yiyˉ)2

代码实现

from sklearn.metrics import r2_score
R_square = r2_score(a, b) 
  • 1
  • 2

参考

区别与联系

区别

  1. 统计意义不同:相关反映两变量间的伴随关系,这种关系是相互的,对等的,不一定有因果关系;回归反映两变量间的依存关系(因果或从属关系),有自变量与应变量之分。
  2. 分析目的不同:相关是把两变量间直线关系的密切程度及方向用统计指标表示出来,回归是把自变量与应变量之间的关系用函数公式定量表达出来。