回归中的相关度和决定系数

本文介绍了皮尔逊相关系数和决定系数的概念及其计算方法。皮尔逊相关系数用于衡量两个变量间的线性相关性,其值范围在-1到1之间。决定系数(R²)则反映了自变量能够解释因变量变异的比例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

训练集中可能是有若干维度的特征。但有时并不是所有特征都是有用的,有的特征其实和结果并没有关系。因此需要一个能衡量自变量和因变量之间的相关度。

皮尔逊相关系数

皮尔逊相关系数(Pearson correlation coefficient),是用于度量两个变量 X 和 Y 之间的相关(线性相关),其值介于[-1,1] 之间。有三种相关情况:

  1. 正向相关: >0
  2. 负向相关:<0
  3. 无相关性:=0

下图从左到右分别代表了正向相关、无相关性和负向相关:

在介绍皮尔逊相关系数之前,要先理解协方差(Covariance ) ,协方差是一个反映两个随机变量相关程度的指标,如果一个变量跟随着另一个变量同时变大或者变小,那么这两个变量的协方差就是正值,反之相反,公式如下:
Conv(X,Y)=∑i=1n(Xi−X‾)(Yi−Y‾)n−1 Conv(X,Y) = \frac{\sum_{i=1}^{n}(X_i-\overline{X})(Y_i-\overline{Y})}{n-1} Conv(X,Y)=n1i=1n(XiX)(YiY)
皮尔逊相关系数的公式如下:
rxy=Conv(X,Y)Var(X)Var(Y)=∑(x−x‾)(y−y‾)∑(x−x‾)2∑(y−y‾)2 r_{xy} = \frac{Conv(X,Y)}{\sqrt{Var(X)Var(Y)}} = \frac{\sum(x-\overline{x})(y-\overline{y})}{\sqrt{\sum{(x-\overline{x})^2}\sum(y-\overline{y})^2}} rxy=Var(X)Var(Y)Conv(X,Y)=(xx)2(yy)2(xx)(yy)
Var表示方差,相关度越高,皮尔逊相关系数其值趋于 1 或 -1 (趋于1表示它们呈正相关, 趋于 -1 表示它们呈负相关);如果相关系数等于0,表明它们之间不存在线性相关关系。

决定系数

决定系数R 平方值,反应因变量的全部变异能通过回归关系被自变量解释的比例。如R平方为0.8,则表示回归关系可以解释因变量80%的变异。换句话说,如果我们能控制自变量不变,则因变量的变异程度会减少 80%。 在简单线性回归中,决定系数可以是 R^2 = r * r。而更通用的是:

SST 其实是两部分组成的,一部分是模型可预测的SSR,一部分是变异的SSError无法用模型解释的。它们之间的计算公式是:

注意: R平方也有其局限性:R平方随着自变量的增加会变大,R平方和样本量是有关系的。因此,我们要到R平方进行修正。修正的方法:
R2‾=1−(1−R2)n−1n−p−1 \overline{R^2} = 1-(1-R^2)\frac{n-1}{n-p-1} R2=1(1R2)np1n1
其中,n 表示样本大小p 表示模型中解释变量的总数(不包括常数)

代码实例

代码完全按照上述中的公式计算

import numpy as np
import math
from sklearn import linear_model

#计算皮尔逊相关系数( Pearson correlation coefficient)
def computer_conv(x,y):
    var_x = 0
    var_y = 0
    SSR = 0
    x_bar = np.mean(x) # x的方差
    y_bar = np.mean(y) # y的方差
    for i in range(len(x)):
        diff_xbar = x[i] - x_bar
        diff_ybar = y[i] - y_bar
        SSR += diff_xbar * diff_ybar
        var_x += diff_xbar**2
        var_y += diff_ybar**2
    SST = math.sqrt(var_x*var_y)
    return SSR/SST

#计算决定系数R平方值
def computer_r(x,y):
    SSR = 0
    SST = 0
    linear = linear_model.LinearRegression() # 创建线性模型
    linear.fit(x,y)
    y_hat = linear.predict(x)
    y_mean = np.mean(y)
    for i in range(len(x)):
        SSR += (y_hat[i] - y_mean)**2
        SST += (y[i] - y_mean)**2
    return SSR/SST

test_x = [1,3,8,7,9]
test_y = [10,12,24,21,34]
test_x2 = [[x] for x in test_x]

print("r: ",computer_conv(test_x,test_y))
print("r平方: ",computer_conv(test_x,test_y)**2)
print("R平方: ",computer_r(test_x2,test_y))

程序运行结果

r:  0.94031007654487
r平方:  0.8841830400518192
R平方:  0.8841830400518192

**我们发现:**在简单线性回归中,决定系数的确满足$ R^2 = r * r$

### 相关系数决定系数的概念及计算 #### 一、相关系数 相关系数 \( r \) 是衡量两个变量之间线性关系强度方向的指标。其取值范围为 [-1, 1],其中正值表示正相关,负值表示负相关,绝对值越大表明线性关系越强。 相关系数的定义式如下: \[ r = \frac{\sum{(x_i - \bar{x})(y_i - \bar{y})}}{\sqrt{\sum{(x_i - \bar{x})^2}\sum{(y_i - \bar{y})^2}}} \] 这里,\( x_i \) \( y_i \) 表示样本数据点,而 \( \bar{x} \) \( \bar{y} \) 则分别代表自变量 X 因变量 Y 的均值[^1]。 #### 二、决定系数 决定系数 \( R^2 \),也称为判定系数或拟合优度,用于评估回归模型对观察数据的解释能力。它是相关系数 \( r \) 的平方,因此它的取值范围为 [0, 1]。较高的 \( R^2 \) 值意味着更多的变异被模型解释了。 决定系数可以通过以下公式计算得出: \[ R^2 = 1 - \frac{SSE}{SST} \] 其中, - SSE(残差平方):\(\sum(y_i - \hat{y}_i)^2\); - SST(总离差平方):\(\sum(y_i - \bar{y})^2\); 这里的 \( \hat{y}_i \) 是预测值,\( y_i \) 是实际观测值,\( \bar{y} \) 是实际观测值的平均值[^3]。 #### 三、两者的区别与联系 尽管相关系数 \( r \) 决定系数 \( R^2 \) 都用来描述变量间的关联程度,但它们有明显的不同之处: - **概念上的差异**:相关系数主要关注的是两个变量之间的线性依赖关系的方向强度,而决定系数则是关于回归模型能够多好地解释响应变量的变化。 - **数值意义的不同**:虽然 \( R^2 = r^2 \)[^2],但是这并不意味着两者完全相同。因为 \( R^2 \) 更加侧重于评价模型的整体性能,尤其是在多元回归的情况下更为明显。 - **适用场景的区别**:对于简单线性回归来说,这两个量可能看起来很相似,但在多重线性回归或者非线性模型中,只有 \( R^2 \) 可以作为整体模型质量的一个指示器[^4]。 另外需要注意,在调整后的决定系数 \( R^2_{adj} \) 中考虑到了自由度的影响因素,使得它成为了一个更加严格的评判标准,尤其适用于复杂模型的选择过程。 ```python import numpy as np def calculate_r(x, y): mean_x = np.mean(x) mean_y = np.mean(y) numerator = sum((xi-mean_x)*(yi-mean_y) for xi,yi in zip(x,y)) denominator = np.sqrt(sum((xi-mean_x)**2 for xi in x)*sum((yi-mean_y)**2 for yi in y)) return numerator/denominator if denominator != 0 else None # Example usage: data_x = [1, 2, 3, 4, 5] data_y = [2, 4, 6, 8, 10] correlation_coefficient = calculate_r(data_x, data_y) print(f'Correlation Coefficient: {correlation_coefficient}') ``` 上述代码展示了如何手动实现相关系数的计算函数 `calculate_r` 并给出了一组简单的例子来进行验证。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bluesliuf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值