可參考司守奎《數學建模算法與應用》P384,概念+例題+代碼
——————————————————————————————
1、概述
灰色關聯分析是指對一個系統發展變化態勢的定量描述和比較的方法,其基本思想是通過確定參考數據列和若干個比較數據列的幾何形狀相似程度來判斷其聯繫是否緊密,它反映了曲線間的關聯程度。
簡介:
灰色系統理論是由著名學者鄧聚龍教授首創的一種系統科學理論(Grey Theory),其中的灰色關聯分析是根據各因素變化曲線幾何形狀的相似程度,來判斷因素之間關聯程度的方法。此方法通過對動態過程發展態勢的量化分析,完成對系統內時間序列有關統計數據幾何關係的比較,求出參考數列與各比較數列之間的灰色關聯度。與參考數列關聯度越大的比較數列,其發展方向和速率與參考數列越接近,與參考數列的關係越緊密。灰色關聯分析方法要求樣本容量可以少到4個,對數據無規律同樣適用,不會出現量化結果與定性分析結果不符的情況。其基本思想是將評價指標原始觀測數進行無量綱化處理,計算關聯繫數、關聯度以及根據關聯度的大小對待評指標進行排序。灰色關聯度的應用涉及社會科學和自然科學的各個領域,尤其在社會經濟領域,如國民經濟各部門投資收益、區域經濟優勢分析、產業結構調整等方面,都取得較好的應用效果。
★ 灰色關聯度分析法是一種多因素統計分析方法,它是以各因素的樣本數據爲依據用灰色關聯度來描述因素間關係的強弱、大小和次序,若樣本數據反映出的兩因素變化的態勢(方向、大小和速度等)基本一致,則它們之間的關聯度較大;反之,關聯度較小。
核心步驟:
【1】確定比較對象(評價對象)(就是數據,並且需要進行規範化處理,就是標準化處理,見下面例題的表格數據)和參考數列(評價標準,一般該列數列都是1,就是最優的的情況)
【2】確定各個指標權重,可用層次分析確定
【3】計算灰色關聯繫數
【4】計算灰色加權關聯度
【5】評價分析
★ 必看案例:對中國經濟增長影響因素進行分析
(重點關注給的5個解題步驟!)
2、代碼復現
①司守奎 P 384
② C++實現
#include<iostream>
#include<cmath>
#define M 6 //此處可進行行列數的修改
#define N 7
using namespace std;
int main()
{
//maxtrix of M N
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); //得到標準化矩陣,+0.01是爲了防止除以0的情況
}
cout << endl;
//下面進行兩級最小差與兩級最大差的計算
//double liangji_max = -1, liangji_min = 10000; //初始化
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;
}
//cout << temp_max << ' ' << temp_min << endl;
//上面已經計算得出兩級最大值和兩級最小值
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;
}