如何使用pandas实现共现矩阵按对角线的归一化操作
共现矩阵按对角线归一化的Pandas实现方法
实现逻辑
按对角线归一化在共现分析场景下通常有两种实现方式,可匹配你在Excel中的计算逻辑选择:
- 行归一化:每个元素除以其所在行的对角线值,计算后每行的对角线值为1,矩阵非对称
- 对称归一化:每个元素除以
sqrt(行对角值 * 列对角值),计算后所有对角线值为1,矩阵对称,是共现分析最常用的归一化方案
完整实现代码
import pandas as pd import numpy as np # 原有生成共现矩阵的逻辑 df = pd.DataFrame({'A':[1,1,1,0,1,1,1,1], 'B':[1,0,1,0,1,1,1,1], 'C':[0,1,0,1,1,0,1,1], 'D':[1,1,1,1,0,1,1,1], 'E':[0,1,1,1,1,1,1,0]}) df_asint = df.astype(int) coocc = df_asint.T.dot(df_asint) # 提取共现矩阵的对角线值 diag_vals = np.diag(coocc) # 方案1:行归一化 coocc_norm_row = coocc / diag_vals[:, np.newaxis] print("行归一化结果:") print(coocc_norm_row.round(4)) # 方案2:对称归一化(共现分析常用) coocc_norm_sym = coocc / np.sqrt(np.outer(diag_vals, diag_vals)) print("\n对称归一化结果:") print(coocc_norm_sym.round(4))
输出示例
对称归一化的输出结果如下,符合对角线全为1的要求:
A B C D E A 1.0000 0.9258 0.6761 0.8571 0.7715 B 0.9258 1.0000 0.5477 0.7715 0.6667 C 0.6761 0.5477 1.0000 0.6761 0.7303 D 0.8571 0.7715 0.6761 1.0000 0.7715 E 0.7715 0.6667 0.7303 0.7715 1.0000
内容的提问来源于stack exchange,提问作者AlbaTroels
相关产品推荐
相关产品推荐

