参考
代码实现
maltab
clc;
close;
clear all;
x=xlsread('data1.xls'); %data1为网上参考数据格式,通过验证该程序没有问题,因此data也应该按照此种格式来布置
x=x(:,2:end)'; %得到转置矩阵
column_num=size(x,2); %列
index_num=size(x,1); %行
% 1、数据均值化处理
x_mean=mean(x,2); % 行向量均值
for i = 1:index_num
x(i,:) = x(i,:)/x_mean(i,1);
end
% 如果三个指标使用三种不同的归一化,则将上述四行代码改为以下形式:
% x(1,:) = 第一个指标的归一化公式;
% x(2,:) = 第二个指标的归一化公式;
% x(3,:) = 第三个指标的归一化公式;
% 2、提取参考队列和比较队列
ck=x(1,:) %第一行
cp=x(2:end,:) %第二行以后所有
cp_index_num=size(cp,1);
%比较队列与参考队列相减
for j = 1:cp_index_num
t(j,:)=cp(j,:)-ck;
end
%求最大差和最小差
mmax=max(max(abs(t)))
mmin=min(min(abs(t)))
rho=0.5;
%3、求关联系数
ksi=((mmin+rho*mmax)./(abs(t)+rho*mmax))
%4、求关联度
weight = [1,0,0;0,1,0;0,0,1];
ksi_column_num=size(ksi,2);
r=sum(weight * ksi,2)/ksi_column_num; %行求和
%5、关联度排序,得到结果r3>r2>r1
[GAG,rind]=sort(r,'descend');
python
import pandas as pd
x=pd.read_excel('data.xlsx')
x=x.iloc[:,1:].T
# 1、数据均值化处理
x_mean=x.mean(axis=1)
for i in range(x.index.size):
x.iloc[i,:] = x.iloc[i,:]/x_mean[i]
# 2、提取参考队列和比较队列
ck=x.iloc[0,:]
cp=x.iloc[1:,:]
# 比较队列与参考队列相减
t=pd.DataFrame()
for j in range(cp.index.size):
temp=pd.Series(cp.iloc[j,:]-ck)
t=t.append(temp,ignore_index=True)
#求最大差和最小差
mmax=t.abs().max().max()
mmin=t.abs().min().min()
rho=0.5
#3、求关联系数
ksi=((mmin+rho*mmax)/(abs(t)+rho*mmax))
#4、求关联度
r=ksi.sum(axis=1)/ksi.columns.size
#5、关联度排序,得到结果r3>r2>r1
result=r.sort_values(ascending=False)
c++
#include<iostream>
#include<cmath>
#define M 6
#define N 7
using namespace std;
int main()
{
double chushi[M][N];
double biaozhunhua[M][N];
cout << "input the matrix:\n";
for (int i = 0;i < M;i++)
for (int j = 0;j < N;j++)
cin >> chushi[i][j];
for (int i = 0;i < M;i++)
{
double Max = -1.0, Min = 10000;
for (int j = 0;j < N;j++)
{
if (chushi[i][j] > Max) Max = chushi[i][j];
if (chushi[i][j] < Min) Min = chushi[i][j];
}
double jizhun = Max - Min;
for (int j = 0;j < N;j++)
biaozhunhua[i][j] = (chushi[i][j] - Min + 0.001) / (jizhun + 0.001);
}
cout << endl;
double temp_max = -1, temp_min = 10000;
for (int i = 0;i < M;i++)
{
double liangji_max = -1, liangji_min = 10000;
for (int j = 0;j < N;j++)
{
for (int k = 0;k < N;k++) {
if (k == j) continue;
double t = fabs(biaozhunhua[i][j] - biaozhunhua[i][k]);
if (t > liangji_max) liangji_max = t;
if (t < liangji_min) liangji_min = t;
}
}
temp_max = liangji_max;
if(liangji_min)
temp_min = liangji_min;
}
double rho = 0.5;
double fenzi = temp_min + rho * temp_max;
double guanlianxishu[M][N];
for(int i = 0;i < M;i++)
{
for (int j = 0;j < N;j++)
{
double t = fabs(biaozhunhua[i][j] - 1.0);
double fenmu = t + rho * temp_max;
guanlianxishu[i][j] = fenzi / fenmu;
}
}
double weight[M] = { 0.29782,0.18947,0.24612,0.34625,0.1667,0.25383 };
double guanliandu[N];
for (int i = 0;i < N;i++)
{
double sum = 0;
for (int j = 0;j < M;j++)
sum += weight[j] * guanlianxishu[j][i];
guanliandu[i] = sum;
}
cout << "1到7号飞机对应的最终关联度分别为:\n";
for (int i = 0;i < N;i++) cout << guanliandu[i] << ' ';
cout << endl;
system("pause");
return 0;
}