灰色关联分析的python实现
时间: 2025-01-04 08:13:45 浏览: 22
### 关于灰色关联分析的Python实现
灰色关联分析是一种用于处理少量样本数据或多因素系统发展态势比较的有效方法。这种方法通过计算序列之间的关联度来评估不同对象间的相似程度。
#### 导入必要的库
为了执行灰色关联分析,首先需要导入一些基本的数据科学工具包:
```python
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
```
#### 数据准备
假设有一个DataFrame `df`,其中包含了多个变量的时间序列数据。这些时间序列可以代表不同的指标或特征随时间的变化情况。这里创建一个简单的例子作为示范输入数据集[^1]。
```python
data = {
'year': [2018, 2019, 2020],
'var_1': [3.7, 4.5, 5.2], # 变量1
'var_2': [10.2, 11.5, 12.6], # 变量2
'ref_series': [4.0, 4.8, 5.6] # 参考序列 (理想值)
}
df = pd.DataFrame(data).set_index('year')
print(df)
# 输出:
# var_1 var_2 ref_series
# year
# 2018 3.7 10.2 4.0
# 2019 4.5 11.5 4.8
# 2020 5.2 12.6 5.6
```
#### 归一化处理
由于各个变量可能具有不同的尺度范围,在进行灰色关联之前通常会对原始数据做标准化转换,使得各列数值处于同一数量级内以便后续运算更加合理可靠。
```python
scaler = MinMaxScaler()
scaled_df = scaler.fit_transform(df[['var_1', 'var_2']])
normalized_data = pd.DataFrame(scaled_df, columns=['norm_var_1', 'norm_var_2'], index=df.index)
reference_series = df['ref_series'].values.reshape(-1, 1)
normalized_reference = scaler.transform(reference_series)[..., 0]
print(normalized_data.join(pd.Series(normalized_reference, name='norm_ref', index=df.index)))
# 输出类似于:
# norm_var_1 norm_var_2 norm_ref
# year
# 2018 0.000000 0.000000 0.000000
# 2019 0.562500 0.562500 0.562500
# 2020 1.000000 1.000000 1.000000
```
#### 计算绝对差分矩阵与最小最大差距
接下来定义两个辅助函数分别用来求解两组数之间对应位置上的差异以及寻找整个数组中的极值点。
```python
def abs_diff_matrix(x, y):
"""Calculate absolute difference matrix between two sequences."""
return np.abs(np.subtract.outer(y, x))
def min_max_gap(diff_mat):
"""Find minimum and maximum gap from an absolute differences matrix."""
diff_min = np.min(diff_mat[np.nonzero(diff_mat)])
diff_max = np.max(diff_mat)
return diff_min, diff_max
```
利用上述定义好的功能构建绝对差分表并找出其内部的最大最小距离值。
```python
diffs = abs_diff_matrix(normalized_data.values.flatten(), normalized_reference)
min_val, max_val = min_max_gap(diffs)
print(f'Minimum Gap: {min_val}, Maximum Gap: {max_val}')
```
#### 构建灰关联系数向量
基于前面得到的结果进一步形成最终所需的灰关联系数表达式,并据此得出每一对对比项间的关系强度系数。
```python
rho = 0.5 # Resolution coefficient
gray_corr_coef = (min_val + rho * max_val) / (diffs.T + rho * max_val)
average_corr = gray_corr_coef.mean(axis=1)
result = pd.DataFrame({
'variable': ['var_1', 'var_2'],
'correlation_coefficient': average_corr,
})
print(result.set_index('variable'))
# 输出形似如下表格形式展示结果:
# correlation_coefficient
# variable
# var_1 some_value_for_var1
# var_2 some_value_for_var2
```
此过程展示了如何使用Python编程语言完成一次完整的灰色关联分析流程。当然实际应用中还需要考虑更多细节问题比如异常检测、缺失值填补等预处理工作以确保模型准确性。
阅读全文