实验要求:
编写两个函数,第一个函数:求相关系数值的函数,第二个函数:求一元线性回归方程中一次项系数的估计值。
第一个函数:求相关系数,输入两个一维向量,输出相关系数值。
第二个函数:求一元线性回归方程中一次项系数的估计值,输入两个一维向量,输出一次项系数值。
测试数据:
x = [1, 2, 3, 4, 5] y = [2, 3, 4, 5, 30]
运行结果:
解析和源代码:
第一个函数(相关系数):
函数定义:这个函数接受两个参数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
第二个函数(一次项系数):
-
初始化:
- 计算 x的长度,即数据点的数量。
- 分别计算 x 和 y 的总和。
-
计算交叉乘积和 x 的平方和:
- 计算 x 和 y 对应元素乘积的总和,在线性回归中用于计算协方差。
- 计算 x 中每个元素的平方的总和,在线性回归中用于计算 x 的方差。
-
计算一次项系数 a:
- 使用最小二乘法(Least Squares Method)的公式来估计 a。
- 公式:
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)