1. 介绍
在数据分析和特征选择中,相关性分析是一个重要的环节。本文介绍了如何使用 MATLAB 计算 Chatterjee 相关系数矩阵,并基于该系数进行特征选择。Chatterjee 相关系数是一种用于衡量变量间依赖关系的方法,适用于非线性相关分析。
Chatterjee 相关系数(Chatterjee's Correlation Coefficient,简称 ξ,读作 "xi")是一种用于衡量两个变量之间依赖关系的非参数统计量。它由 Sourav Chatterjee 在 2021 年提出,旨在克服传统相关系数(如 Pearson 相关系数)的局限性,特别是在非线性关系和非单调关系的情况下。
Chatterjee 相关系数的特点
非参数性:
不依赖于数据的分布假设,适用于任意类型的变量(连续、离散、有序等)。
非线性关系检测:
能够捕捉非线性关系,而 Pearson 相关系数只能衡量线性关系。
单调性不敏感:
即使变量之间的关系不是单调的,Chatterjee 相关系数仍然能够有效衡量依赖关系。
范围:
取值范围为 [0, 1],其中:
0 表示完全独立(无依赖关系)。
1 表示完全依赖(确定性关系)。
对称性:
与 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 相关系数矩阵,并基于该系数进行特征选择。通过可视化工具(热力图、柱状图和散点图),我们可以更直观地分析变量之间的关系,并筛选出最相关的特征。
该方法可用于各种数据分析场景,特别是在回归建模和机器学习领域,有助于提高模型的性能和解释性。
完整代码:
% 读取 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
运行结果: