【scau统计学】Python实验四求相关系数值,求一元线性回归方程中一次项系数的估计值

实验要求:

编写两个函数,第一个函数:求相关系数值的函数,第二个函数:求一元线性回归方程中一次项系数的估计值。

第一个函数:求相关系数,输入两个一维向量,输出相关系数值。

第二个函数:求一元线性回归方程中一次项系数的估计值,输入两个一维向量,输出一次项系数值。

测试数据:

x = [1, 2, 3, 4, 5]
y = [2, 3, 4, 5, 30]

运行结果:

bc527dffd9dd474198ed022448dda07f.png

解析和源代码:

第一个函数(相关系数):

函数定义:这个函数接受两个参数x和y(一维向量)
1.长度检查,确保x和y的长度相同,否则抛出一个ValueError。
2.计算x,y均值。
3.计算分子:使用列表推导式来计算x和y的协方差。
4.计算分母(标准差的乘积):分别计算x,y与各自均值之差的平方和,然后开方得到标准差。
5.使用协方差的分子和标准差乘积的分母来计算相关系数。

def calculate_correlation_coefficient(x, y):
    n = len(x)
    if n != len(y):
        raise ValueError("Vectors x and y must have the same length.")

    # 计算均值
    mean_x = sum(x) / n
    mean_y = sum(y) / n

    # 计算分子
    numerator = sum((x[i] - mean_x) * (y[i] - mean_y) for i in range(n))

    # 计算分母
    denominator_x = sum((x[i] - mean_x) ** 2 for i in range(n))
    denominator_y = sum((y[i] - mean_y) ** 2 for i in range(n))
    denominator = (denominator_x * denominator_y) ** 0.5

    # 计算相关系数
    correlation = numerator / denominator
    return correlation

第二个函数(一次项系数):

  1. 初始化:

    • 计算 x的长度,即数据点的数量。
    • 分别计算 x 和 y 的总和。
  2. 计算交叉乘积和 x 的平方和:

    • 计算 x 和 y 对应元素乘积的总和,在线性回归中用于计算协方差。
    • 计算 x 中每个元素的平方的总和,在线性回归中用于计算 x 的方差。
  3. 计算一次项系数 a:

    • 使用最小二乘法(Least Squares Method)的公式来估计 a。
    • 公式:3daca400c36e43848cc1043ee9948ed1.png
def linear_regression(x, y):
    n = len(x)
    sum_x = sum(x)
    sum_y = sum(y)
    sum_xy = sum(x[i] * y[i] for i in range(n))
    sum_x_squared = sum(x[i] ** 2 for i in range(n))

    # 计算一次项系数的估计值
    a = (n * sum_xy - sum_x * sum_y) / (n * sum_x_squared - sum_x ** 2)

    return a

合并起来全部代码:

此处加入了工具箱函数验证输出结果是否正确(与手搓代码是否一致)

import numpy as np


def calculate_correlation_coefficient(x, y):
    n = len(x)
    if n != len(y):
        raise ValueError("Vectors x and y must have the same length.")

    # 计算均值
    mean_x = sum(x) / n
    mean_y = sum(y) / n

    # 计算分子
    numerator = sum((x[i] - mean_x) * (y[i] - mean_y) for i in range(n))

    # 计算分母
    denominator_x = sum((x[i] - mean_x) ** 2 for i in range(n))
    denominator_y = sum((y[i] - mean_y) ** 2 for i in range(n))
    denominator = (denominator_x * denominator_y) ** 0.5

    # 计算相关系数
    correlation = numerator / denominator
    return correlation


# 示例
x = [1, 2, 3, 4, 5]
y = [2, 3, 4, 5, 30]
print('两个向量之间的相关系数为:',calculate_correlation_coefficient(x, y))  # 输出应接近1

# 验证
correlation = np.corrcoef(x, y)[0, 1]
print("验证", correlation)



def linear_regression(x, y):
    n = len(x)
    sum_x = sum(x)
    sum_y = sum(y)
    sum_xy = sum(x[i] * y[i] for i in range(n))
    sum_x_squared = sum(x[i] ** 2 for i in range(n))

    # 计算一次项系数的估计值
    a = (n * sum_xy - sum_x * sum_y) / (n * sum_x_squared - sum_x ** 2)
    return a

# 计算一次项系数的估计值
a_estimate = linear_regression(x, y)
print("一次项系数的估计值为:", a_estimate)
# 验证
slope_estimate = np.polyfit(x, y, 1)[0]
print('验证:', slope_estimate)

 

 

 

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值