解题思路
- 数据读取:获取样本数量
和特征数量
- 构建数据集:分离特征矩阵和目标值向量
- 相关系数计算:对每个特征计算与目标值的皮尔逊相关系数
- 结果排序:按相关系数绝对值降序排序(绝对值相同按索引升序)
- 格式化输出:输出所有特征索引和相关系数(保留4位小数)
代码解析
import sys
import numpy as np
def read_data(N, M):
"""读取数据集并分离特征和目标值"""
data = [] # 特征矩阵
targets = [] # 目标值向量
for _ in range(N):
line = sys.stdin.readline().strip()
elements = list(map(float, line.split()))
data.append(elements[:-1]) # 前M个为特征
targets.append(elements[-1]) # 最后一个为目标值
return np.array(data), np.array(targets)
def compute_pearson_correlation(features, target):
"""计算每个特征与目标值的皮尔逊相关系数"""
M = features.shape[1]
correlations = []
for i in range(M):
X = features[:, i] # 当前特征列
Y = target # 目标值列
# 计算均值
X_mean = np.mean(X)
Y_mean = np.mean(Y)
# 计算分子:协方差部分
numerator = np.sum((X - X_mean) * (Y - Y_mean))
# 计算分母:标准差乘积
X_std = np.sqrt(np.sum((X - X_mean) ** 2))
Y_std = np.sqrt(np.sum((Y - Y_mean) ** 2))
denominator = X_std * Y_std
# 处理分母为0的情况
r = numerator / denominator if denominator != 0 else 0
correlations.append((i, r))
return correlations
def sort_features(correlations):
"""按相关系数绝对值降序排序(绝对值相同按索引升序)"""
return sorted(correlations,
key=lambda x: (-abs(x[1]), x[0]))
if __name__ == "__main__":
# 读取样本数和特征数
N, M = map(int, sys.stdin.readline().split())
# 读取数据集
data, targets = read_data(N, M)
# 读取K值(本题中实际未使用)
K = int(sys.stdin.readline())
# 计算相关系数
correlations = compute_pearson_correlation(data, targets)
# 排序特征
sorted_features = sort_features(correlations)
# 输出结果
for idx, corr in sorted_features:
print(f"{idx} {corr:.4f}")
关键函数说明
-
read_data(N, M)
:- 输入:样本数
,特征数
- 输出:特征矩阵(
)和目标值向量(
维)
- 过程:逐行读取数据,分离特征和目标值
- 输入:样本数
-
compute_pearson_correlation(features, target)
:- 输入:特征矩阵,目标值向量
- 输出:包含(特征索引,相关系数)的列表
- 过程:
- 遍历每个特征列
- 计算特征和目标值的均值
- 计算协方差(分子)
- 计算标准差乘积(分母)
- 处理除零情况
-
sort_features(correlations)
:- 输入:相关系数列表
- 输出:排序后的相关系数列表
- 排序规则:
- 主序:相关系数绝对值降序
- 次序:特征索引升序
总结
本题实现了基于皮尔逊相关系数的特征重要性分析:
- 皮尔逊相关系数有效量化特征与目标值的线性相关性
- 通过绝对值排序识别最具影响力的特征
- 适用于销售预测、用户行为分析等场景
- 输出结果可直接用于指导产品优化策略
该方法能快速识别与销售强相关的特征,帮助团队聚焦关键产品特性的优化,提升商业决策效率。