Matlab计算相关系数并分组生成图片
本次任务要实现的功能是:1、计算相关系数 2、生成相关系数的折线图 3、将相关系数分组输出到一张图中,并自动保存到磁盘。
原始数据
- 原始数据保存在Excel表中
- 原始数据为30*62,第一列为样本编号,第一行为特征名称,其余全部为浮点数,且无空值
计算相关系数
相关系数的计算并不难,直接用Matlab的corrcoef
函数进行计算,但是其表达方式较为复杂。
- 设初始样本集合为
S={}
- 按顺序向
S
中添加样本,并计算S
中其余特征关于第一个特征Ashd的相关系数 - 得到相关系数矩阵R,形状为29*61,其中R(i,j)表示:当S中的样本为前i个时,特征j关于特征Ashd的相关系数。
计算过程
读入数据并过滤样本编号和列名
clc,clear
[data,e_names,raw] =xlsread('D:\Projects\data\data_origin.xlsx');
x_ashs=data(1:29,2); %特征Ashd的值,用于生成图表
data = data(1:29,2:62);
计算相关系数
relat_ashs=zeros(29,61);
for i=1:29
data_x=data(1:i,:);
a=corrcoef(data_x);
relat_ashs(i,:)=a(1,:);
end
用K-Means分组,将相似的相关系数分为一组
relat_ashs(:,1)=[]; %删去第一列,即Ashd自己和自己的相关系数
F=relat_ashs;
F(1,:)=[]; %删去第一行,即样本数为1时的相关系数
F(isnan(F))=0; %填充NaN为0
[idx,C,sumd,D]=kmeans(F',12); %利Matlab的KMeans函数,idx中保存组号
分组生成图片并保存
for i =1:12
figure(i);
[row,col,v]=find(idx==i);
for j=1:size(row) %自动调色只有7种,用不同的标识区分
if mod(j,2)==0
plot(relat_ashs(:,row(j)),'-o','LineWidth',1.3);
else
plot(relat_ashs(:,row(j)),'-*','LineWidth',1.3);
end
hold on
end
legend(e_names(row+2));
xlabel("Add a sample with an ashd value of x",'FontSize',20);
ylabel("correlation coefficients",'FontSize',20);
xticks(1:29);
ylim([-1 1]);
xticklabels(x_ashs);
grid on;
set(gcf,'position',[0 0 1920 1080]); %图片位置及大小
set(gca,'Gridalpha',1); %网格透明度
path=['D:\Projects\MatlabProjects\many_class\relat_element\relat_element_class_',num2str(i),'.png'];
print(i,'-dpng',path);
end