MATLAB 实现 Chatterjee 相关系数矩阵计算与特征选择

1. 介绍

在数据分析和特征选择中,相关性分析是一个重要的环节。本文介绍了如何使用 MATLAB 计算 Chatterjee 相关系数矩阵,并基于该系数进行特征选择。Chatterjee 相关系数是一种用于衡量变量间依赖关系的方法,适用于非线性相关分析。

Chatterjee 相关系数 (Chatterjee's Correlation Coefficient,简称 ξ,读作 "xi")是一种用于衡量两个变量之间依赖关系的非参数统计量。它由 Sourav Chatterjee 在 2021 年提出,旨在克服传统相关系数(如 Pearson 相关系数)的局限性,特别是在非线性关系和非单调关系的情况下。

Chatterjee 相关系数的特点

  1. 非参数性

    • 不依赖于数据的分布假设,适用于任意类型的变量(连续、离散、有序等)。
  2. 非线性关系检测

    • 能够捕捉非线性关系,而 Pearson 相关系数只能衡量线性关系。
  3. 单调性不敏感

    • 即使变量之间的关系不是单调的,Chatterjee 相关系数仍然能够有效衡量依赖关系。
  4. 范围

    • 取值范围为 [0, 1],其中:

      • 0 表示完全独立(无依赖关系)。

      • 1 表示完全依赖(确定性关系)。

  5. 对称性

    • 与 Pearson 相关系数不同,Chatterjee 相关系数是非对称的,即 ξ(X, Y) ≠ ξ(Y, X)。

2. 代码解析

2.1 读取数据

首先,我们从 Excel 文件中读取数据,并获取数据的维度信息。

复制代码
% 读取 Excel 文件中的数据
data = readmatrix('data.xlsx');  % 假设数据保存在 'data.xlsx'

% 获取数据的大小
[n, m] = size(data);  % n 是行数,m 是列数

2.2 计算 Chatterjee 相关系数矩阵

我们初始化一个空的 Chatterjee 系数矩阵,并逐列计算相关系数。

复制代码
% 初始化 Chatterjee 系数矩阵
chatterjee_matrix = zeros(m, m);  

% 计算 Chatterjee 系数矩阵
for i = 1:m
    for j = 1:m
        % 取出第 i 列和第 j 列数据
        x = data(:, i);
        y = data(:, j);
        
        % 检查数据列是否几乎相等
        if max(abs(x - y)) < 1e-10
            % 如果两列数据几乎相等,直接赋值为 1
            chatterjee_matrix(i, j) = 1;
        else
            % 计算 Chatterjee 系数
            chatterjee_matrix(i, j) = chatterjee(x, y, n);
        end
    end
end

2.3 输出计算结果

将计算结果保存至 Excel 文件,并绘制热力图。

复制代码
% 将 Chatterjee 系数矩阵写入 Excel 文件
writematrix(chatterjee_matrix, 'chatterjee_results.xlsx');

% 绘制热力图
figure;
h = heatmap(chatterjee_matrix, 'Colormap', jet, 'ColorbarVisible', 'on');
title('Chatterjee Coefficient Heatmap');
xlabel('Column Index');
ylabel('Column Index');
colormap("cool")

2.4 特征选择

基于 Chatterjee 相关系数矩阵,我们提取特征与目标变量(最后一列)的相关性,并选择最相关的前 3 个特征。

复制代码
% 提取特征与目标变量的相关系数(最后一列为因变量)
target_corr = chatterjee_matrix(1:end-1, end); % 排除目标列自身

% 排序并选择特征
[corr_sorted, idx_sorted] = sort(target_corr, 'descend');
topN = 3; % 选择相关性最高的前3个特征(可修改)
selected_idx = idx_sorted(1:topN);
selected_corr = corr_sorted(1:topN);

% 保存选中的特征结果
selected_features = [(1:m-1)', target_corr];
writematrix(selected_features, 'feature_rankings.xlsx');

2.5 可视化特征相关性排序

使用柱状图展示特征相关性排序,并绘制前 N 个特征与目标变量的散点图。

复制代码
% 绘制特征相关性排序图
figure;
barh(corr_sorted, 'FaceColor', [0.2 0.6 0.8]);
set(gca, 'YDir', 'reverse', 'YTick', 1:length(corr_sorted),...
    'YTickLabel', idx_sorted);
xlabel('Chatterjee 相关系数');
ylabel('特征索引');
title('特征与目标变量相关性排序');
grid on;

% 绘制前N个特征对比图
figure;
tiledlayout('flow');
for i = 1:topN
    nexttile;
    scatter(data(:, selected_idx(i)), data(:, end), 15,...
        'filled', 'MarkerFaceAlpha', 0.6);
    xlabel(['特征 ', num2str(selected_idx(i))]);
    ylabel('目标变量');
    title(sprintf('相关系数: %.3f', selected_corr(i)));
end
sgtitle('Top特征与目标变量散点图');

2.6 Chatterjee 系数计算函数

以下是计算 Chatterjee 系数的 MATLAB 函数。

复制代码
function coeff = chatterjee(x, y, n)
    % 将数据列转为符号类型以提高精度
    x = vpa(x, 50);  % 使用高精度计算(50位)
    y = vpa(y, 50);  % 使用高精度计算(50位)
    
    % 排序并计算 Chatterjee 系数
    [~, b] = sort(x);  % 对 x 排序
    for i = 1:n
        x(i) = y(b(i));  % 根据排序后的索引更新 x
    end

    [~, b] = sort(x);  % 对 x 再排序
    [~, r] = sort(b);  % 对 z 进行排序
    
    sum_diff = 0;
    for i = 2:n
        sum_diff = sum_diff + abs(r(i) - r(i-1));  % 索引差的绝对值之和
    end
    
    % 计算 Chatterjee 系数
    coeff = 1 - (3 * sum_diff) / (n * n - 1);
    
    % 强制 Chatterjee 系数在 [0, 1] 范围内
    coeff = max(0, min(1, coeff));
end

3. 结论

本文介绍了如何使用 MATLAB 计算 Chatterjee 相关系数矩阵,并基于该系数进行特征选择。通过可视化工具(热力图、柱状图和散点图),我们可以更直观地分析变量之间的关系,并筛选出最相关的特征。

该方法可用于各种数据分析场景,特别是在回归建模和机器学习领域,有助于提高模型的性能和解释性。

完整代码:

Matlab 复制代码
% 读取 Excel 文件中的数据
data = readmatrix('data.xlsx');  % 假设数据保存在 'data.xlsx'

% 获取数据的大小
[n, m] = size(data);  % n 是行数,m 是列数

% 初始化 Chatterjee 系数矩阵
chatterjee_matrix = zeros(m, m);  

% 计算 Chatterjee 系数矩阵
for i = 1:m
    for j = 1:m
        % 取出第 i 列和第 j 列数据
        x = data(:, i);
        y = data(:, j);
        
        % 检查数据列是否几乎相等
        if max(abs(x - y)) < 1e-10
            % 如果两列数据几乎相等,直接赋值为 1
            chatterjee_matrix(i, j) = 1;
        else
            % 计算 Chatterjee 系数
            chatterjee_matrix(i, j) = chatterjee(x, y, n);
        end
    end
end

% 将 Chatterjee 系数矩阵写入 Excel 文件
writematrix(chatterjee_matrix, 'chatterjee_results.xlsx');

% 绘制热力图
figure;
h = heatmap(chatterjee_matrix, 'Colormap', jet, 'ColorbarVisible', 'on');
title('Chatterjee Coefficient Heatmap');
xlabel('Column Index');
ylabel('Column Index');
colormap("cool")

% ========== 新增特征选择模块 ==========
% 提取特征与目标变量的相关系数(最后一列为因变量)
target_corr = chatterjee_matrix(1:end-1, end); % 排除目标列自身

% 排序并选择特征
[corr_sorted, idx_sorted] = sort(target_corr, 'descend');
topN = 3; % 选择相关性最高的前3个特征(可修改)
selected_idx = idx_sorted(1:topN);
selected_corr = corr_sorted(1:topN);

% 保存选中的特征结果
selected_features = [(1:m-1)', target_corr];
writematrix(selected_features, 'feature_rankings.xlsx');

% 绘制特征相关性排序图
figure;
barh(corr_sorted, 'FaceColor', [0.2 0.6 0.8]);
set(gca, 'YDir', 'reverse', 'YTick', 1:length(corr_sorted),...
    'YTickLabel', idx_sorted);
xlabel('Chatterjee 相关系数');
ylabel('特征索引');
title('特征与目标变量相关性排序');
grid on;

% 绘制前N个特征对比图
figure;
tiledlayout('flow');
for i = 1:topN
    nexttile;
    scatter(data(:, selected_idx(i)), data(:, end), 15,...
        'filled', 'MarkerFaceAlpha', 0.6);
    xlabel(['特征 ', num2str(selected_idx(i))]);
    ylabel('目标变量');
    title(sprintf('相关系数: %.3f', selected_corr(i)));
end
sgtitle('Top特征与目标变量散点图');

% 输出成功信息
disp('Chatterjee 系数已计算并输出到 "chatterjee_results.xlsx"');
disp(['已选择特征: ', num2str(selected_idx')]);

% Chatterjee 系数计算的逻辑(保持不变)
function coeff = chatterjee(x, y, n)
    % 将数据列转为符号类型以提高精度
    x = vpa(x, 50);  % 使用高精度计算(50位)
    y = vpa(y, 50);  % 使用高精度计算(50位)
    
    % 排序并计算 Chatterjee 系数
    [~, b] = sort(x);  % 对 x 排序
    for i = 1:n
        x(i) = y(b(i));  % 根据排序后的索引更新 x
    end

    [~, b] = sort(x);  % 对 x 再排序
    [~, r] = sort(b);  % 对 z 进行排序
    
    sum_diff = 0;
    for i = 2:n
        sum_diff = sum_diff + abs(r(i) - r(i-1));  % 索引差的绝对值之和
    end
    
    % 计算 Chatterjee 系数
    coeff = 1 - (3 * sum_diff) / (n * n - 1);
    
    % 强制 Chatterjee 系数在 [0, 1] 范围内
    coeff = max(0, min(1, coeff));
end

运行结果:

相关推荐
晟诺数字人3 分钟前
2026年海外直播变革:数字人如何改变游戏规则
大数据·人工智能·产品运营
蛋王派4 分钟前
DeepSeek-OCR-v2 模型解析和部署应用
人工智能·ocr
禁默9 分钟前
基于CANN的ops-cv仓库-多模态场景理解与实践
人工智能·cann
禁默18 分钟前
【硬核入门】无需板卡也能造 AI 算子?深度玩转 CANN ops-math 通用数学库
人工智能·aigc·cann
敏叔V58723 分钟前
AI智能体的工具学习进阶:零样本API理解与调用
人工智能·学习
徐小夕@趣谈前端32 分钟前
拒绝重复造轮子?我们偏偏花365天,用Vue3写了款AI协同的Word编辑器
人工智能·编辑器·word
阿里云大数据AI技术32 分钟前
全模态、多引擎、一体化,阿里云DLF3.0构建Data+AI驱动的智能湖仓平台
人工智能·阿里云·云计算
陈天伟教授33 分钟前
人工智能应用- 语言理解:05.大语言模型
人工智能·语言模型·自然语言处理
池央34 分钟前
CANN GE 深度解析:图编译器的核心优化策略、执行流调度与模型下沉技术原理
人工智能·ci/cd·自动化
七月稻草人37 分钟前
CANN ops-nn:AIGC底层神经网络算力的核心优化引擎
人工智能·神经网络·aigc·cann