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

运行结果:

相关推荐
ABS_Plastic6 分钟前
MATLAB在数据分析和绘图中的应用:从基础到实践
matlab
CodeJourney.11 分钟前
AI赋能办公:开启高效职场新时代
数据库·人工智能·算法
yscript18 分钟前
linux系统安装和激活conda
linux·运维·人工智能·python·深度学习·conda
szxinmai主板定制专家25 分钟前
基于FPGA的3U机箱轨道交通网络通讯板,对内和主控板、各类IO板通信,对外可进行RS485、CAN或MVB组网通信
大数据·人工智能·嵌入式硬件·fpga开发·边缘计算
海特伟业40 分钟前
森林防火预警广播监控系统:以4G为纽带架构融合智能广播、远程监控、AI智能识别、告警提示、太阳能供电于一体的新一代森林防火预警系统
人工智能·架构
KangkangLoveNLP42 分钟前
简单循环神经网络(RNN):原理、结构与应用
人工智能·pytorch·rnn·深度学习·神经网络·机器学习·transformer
未来之窗软件服务1 小时前
数字人本地部署之llama-本地推理模型
人工智能·llama·数字人
扶摇升1 小时前
大型语言模型(LLM)部署中的内存消耗计算
人工智能·语言模型·自然语言处理
xiao5kou4chang6kai41 小时前
基于ChatGPT、DeepSeek、GIS与Python机器学习的地质灾害风险评估、易发性分析、信息化建库及灾后重建
人工智能·gis·地质灾害
图生生1 小时前
图生生AI修图,用“画面扩充“重构创作想象
大数据·人工智能·ai·ai作画·图生生·ai修图·画面重构