修复numpy sliding_window_view报错,计算数组特征与一维数组的相关系数
问题解决与替代实现方法
错误原因与修复
你用sliding_window_view时出错,根源是x是2维数组(形状(442,10)),但你只传了一个窗口大小参数——这个函数要求窗口形状的维度数必须和输入数组的维度数完全匹配,所以得给每个维度指定窗口大小。
但实际上你根本不需要滑动窗口:x的每一列就是一个长度为442的特征,直接取列和y计算相关系数即可,滑动窗口在这里完全多余。修复后的代码可以去掉sliding_window_view,直接对x的列进行计算:
import numpy as np def np_corr(w, z): n = len(z) sum_w = np.sum(w, axis=0) sum_w2 = np.sum(w**2, axis=0) sum_z = np.sum(z) sum_z2 = np.sum(z**2) numerator = n * np.sum(w * z[:, None], axis=0) - sum_w * sum_z denom = np.sqrt((n * sum_w2 - sum_w**2) * (n * sum_z2 - sum_z**2)) return np.divide(numerator, denom, where=denom != 0) # 直接传入x,按列计算每个特征与y的相关系数 corr = np_corr(x, y) print(corr) # 输出形状为(10,)的数组,对应10个特征与y的相关系数
更简洁的替代实现方法
方法1:用numpy内置np.corrcoef直接计算
numpy提供了现成的相关系数计算函数,代码更简洁易读:
import numpy as np # 把y转为列向量,和x拼接成(442,11)的数组 combined = np.hstack([x, y[:, None]]) # 计算相关系数矩阵,rowvar=False表示每一列是一个变量 corr_matrix = np.corrcoef(combined, rowvar=False) # 取最后一行的前10个值,就是y与x各特征的相关系数 corr = corr_matrix[-1, :-1] print(corr)
方法2:通过协方差矩阵推导相关系数
相关系数可由协方差和标准差推导而来,公式为corr = cov(x,y)/(std(x)*std(y)),实现代码:
import numpy as np # 计算协方差矩阵(每列是变量) cov_matrix = np.cov(x, y, rowvar=False) # 取出x各特征与y的协方差 cov_xy = cov_matrix[:-1, -1] # 计算x各特征的标准差和y的标准差 std_x = np.sqrt(np.diag(cov_matrix[:-1, :-1])) std_y = np.sqrt(cov_matrix[-1, -1]) # 计算相关系数 corr = cov_xy / (std_x * std_y) print(corr)
内容的提问来源于stack exchange,提问作者rakh
相关产品推荐
相关产品推荐

