Matlab计算相关系数并分组生成图片

714

本次任务要实现的功能是:1、计算相关系数 2、生成相关系数的折线图 3、将相关系数分组输出到一张图中,并自动保存到磁盘。

原始数据

  • 原始数据保存在Excel表中
  • 原始数据为30*62,第一列为样本编号,第一行为特征名称,其余全部为浮点数,且无空值

计算相关系数

相关系数的计算并不难,直接用Matlab的corrcoef函数进行计算,但是其表达方式较为复杂。

  1. 设初始样本集合为S={}
  2. 按顺序向S中添加样本,并计算S其余特征关于第一个特征Ashd的相关系数
  3. 得到相关系数矩阵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