You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DeepGraph计算相关性添加p值报错:Data must be 1-dimensional

解决DeepGraph计算p值时的维度错误问题

问题场景

使用DeepGraph库计算大矩阵的相关系数,输出为多级索引DataFrame,希望添加对应p值列,自定义p_Val函数计算p值时触发如下错误:

ValueError: Data must be 1-dimensional

错误原因

p_Val函数中调用scipy.stats.spearmanr的方式不符合DeepGraph的要求:

  • index_s和index_t是批量索引,对应多对特征,features_s和features_t为二维数组(形状为[批量数, 样本数])
  • 默认的spearmanr会对整个二维数组计算全局相关系数,返回单个p值而非每个特征对对应的一维p值数组,导致DeepGraph无法将其转换为DataFrame的列

对比正确的corr函数:用np.einsum批量处理每一对特征,返回一维数组,完全符合DeepGraph对connector函数的输出要求。

解决方案

方案1:修改p_Val函数,返回一维p值数组

调整p_Val函数,遍历每一对特征计算p值,最终返回一维numpy数组:

def p_Val(index_s, index_t):
    features_s = X[index_s]
    features_t = X[index_t]
    p_values = []
    for s, t in zip(features_s, features_t):
        _, p = spearmanr(s, t)
        p_values.append(p)
    return np.array(p_values)

方案2:合并计算逻辑,提升效率

更高效的方式是将相关系数和p值的计算合并到一个connector函数中,避免重复创建DeepGraph实例和加载特征数据:

def corr_and_pval(index_s, index_t):
    features_s = X[index_s]
    features_t = X[index_t]
    # 批量计算Spearman相关系数(已提前对X做排序,等价于Pearson计算)
    corr = np.einsum('ij,ij->i', features_s, features_t) / n_samples
    # 批量计算p值
    p_values = []
    for s, t in zip(features_s, features_t):
        _, p = spearmanr(s, t)
        p_values.append(p)
    # 返回包含两列的DataFrame
    return pd.DataFrame({'corr': corr, 'p_val': np.array(p_values)})

然后修改create_ei函数,仅需一次边创建操作:

def create_ei(i):
    from_pos = pos_array[i]
    to_pos = pos_array[i+1]
    g = dg.DeepGraph(v)
    # 一次创建包含相关系数和p值的边表
    g.create_edges(connectors=corr_and_pval, step_size=step_size, from_pos=from_pos, to_pos=to_pos)
    g.e.to_pickle('tmp/correlations/{}_corr_pval.pickle'.format(str(i).zfill(3)))

额外修复

删除代码末尾多余的store.close()语句(未初始化store对象,会引发新的错误)。

内容的提问来源于stack exchange,提问作者AennaPhD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 07:20:43