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

运行结果:

相关推荐
NAGNIP10 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab11 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab11 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP15 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年15 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼15 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS16 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区17 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈17 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang17 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx