在众多领域中,我们常常需要分析多个因素之间的关联程度。灰色关联分析(Grey Relational Analysis,GRA)作为一种有效的数据分析方法,能够在数据有限、信息不完全明确的情况下,定量地描述因素之间的关联关系。它通过比较序列曲线之间的几何形状相似程度来判断因素间的关联程度,具有计算简单、结果直观等优点。本文将详细介绍灰色关联分析的原理,并结合 Python 代码示例展示其具体实现过程。
灰色关联分析的基本思想是根据序列曲线几何形状的相似程度来判断其联系是否紧密。曲线越接近,相应序列之间的关联度就越大,反之则越小。它通过计算灰色关联系数来衡量因素之间的关联程度,进而得出关联度排序。
Python 代码主要包含四个核心函数input_matrix
、preprocess_matrix
、calculate_absolute_difference
和main
,用于实现灰色关联分析的各个步骤。
input_matrix
函数def input_matrix():
"""
从用户输入获取初始矩阵,第一列为母序列,其余为子序列。
对输入的行数、列数和每行元素进行验证,确保输入的矩阵符合要求。
:return: 输入的矩阵,如果输入无效则返回 None
"""
print('请输入初始矩阵,第一列为母序列,其余为子序列。')
while True:
try:
rows = int(input('请输入矩阵的行数: '))
cols = int(input('请输入矩阵的列数: '))
if rows <= 0 or cols <= 0:
print("行数和列数必须为正整数,请重新输入。")
continue
break
except ValueError:
print("输入的行数或列数不是有效的整数,请重新输入。")
print('请依次输入每一行的元素,用逗号分隔。')
matrix = []
for i in range(rows):
while True:
row_input = input(f"第 {i + 1} 行: ")
try:
row = [float(num) for num in row_input.split(',')]
if len(row) != cols:
print(f"输入的第 {i + 1} 行元素数量不正确,请输入 {cols} 个元素。")
continue
matrix.append(row)
break
except ValueError:
print(f"输入的第 {i + 1} 行包含非数字元素,请重新输入。")
matrix = np.array(matrix)
print('输入的矩阵为:\n', matrix)
return matrix
该函数负责从用户处获取初始矩阵。首先提示用户输入矩阵的行数和列数,并进行有效性验证,确保输入的行数和列数为正整数。然后,逐行获取用户输入的矩阵元素,将输入的字符串以逗号分隔并转换为浮点数列表,验证每行元素数量是否与列数一致。将所有行的元素组合成列表后,转换为numpy
数组并打印输出,最后返回该矩阵。如果用户输入无效(如非数字元素或元素数量不匹配),会提示用户重新输入。
preprocess_matrix
函数def preprocess_matrix(matrix):
"""
对矩阵进行预处理,计算每列的均值并进行归一化。
:param matrix: 输入的矩阵
:return: 预处理后的矩阵
"""
column_means = np.mean(matrix, axis=0)
normalized_matrix = matrix / column_means
return normalized_matrix
此函数对输入的矩阵进行预处理。通过numpy
的mean
函数计算矩阵每列的均值,得到column_means
。然后将矩阵的每个元素除以对应列的均值,实现数据的归一化,消除量纲和数量级的影响,返回预处理后的矩阵normalized_matrix
。
calculate_absolute_difference
函数def calculate_absolute_difference(normalized_matrix):
"""
计算母序列与子序列的绝对差值矩阵,并计算灰色关联系数。
:param normalized_matrix: 预处理后的矩阵
:return: 每列与母序列的灰色关联系数
"""
# 母序列
reference_sequence = normalized_matrix[:, 0]
# 子序列
comparison_sequences = normalized_matrix[:, 1:]
# 将母序列扩展为与子序列相同的形状
extended_reference = np.tile(reference_sequence.reshape(-1, 1), (1, comparison_sequences.shape[1]))
# 计算绝对差值矩阵
absolute_difference = np.abs(comparison_sequences - extended_reference)
# 计算两级最小差
min_difference = np.min(absolute_difference)
# 计算两级最大差
max_difference = np.max(absolute_difference)
# 分辨系数取 0.5
rho = 0.5
# 计算每一个指标与母序列的关联系数
correlation_coefficient = (min_difference + rho * max_difference) / (absolute_difference + rho * max_difference)
# 计算每列与母序列的平均灰色关联系数
average_correlation = np.mean(correlation_coefficient, axis=0)
return average_correlation
该函数计算母序列与子序列的绝对差值矩阵,并进一步计算灰色关联系数。首先从预处理后的矩阵中提取出母序列reference_sequence
(第一列)和子序列comparison_sequences
(其余列)。使用numpy
的tile
函数将母序列扩展为与子序列相同的形状,以便进行逐元素相减,得到绝对差值矩阵absolute_difference
。接着计算绝对差值矩阵中的两级最小差min_difference
和两级最大差max_difference
。设定分辨系数rho
为 0.5,根据灰色关联系数的计算公式,计算每个子序列与母序列在各个时刻的关联系数correlation_coefficient
。最后对每个子序列的关联系数求平均值,得到每列与母序列的平均灰色关联系数average_correlation
并返回。
main
函数def main():
"""
主函数,负责调用其他函数完成整个流程。
"""
matrix = input_matrix()
if matrix is not None:
normalized_matrix = preprocess_matrix(matrix)
correlation_coefficients = calculate_absolute_difference(normalized_matrix)
print('每一列与母序列的灰色关联系数为:\n', correlation_coefficients)
main
函数是整个程序的入口,负责调用其他函数完成灰色关联分析的流程。首先调用input_matrix
函数获取用户输入的矩阵,如果输入有效,则对矩阵进行预处理,调用preprocess_matrix
函数得到预处理后的矩阵normalized_matrix
。然后,使用预处理后的矩阵计算灰色关联系数,调用calculate_absolute_difference
函数得到每列与母序列的灰色关联系数correlation_coefficients
。最后打印输出灰色关联系数。
假设我们要研究某地区的经济增长与多个因素之间的关联程度,如固定资产投资、消费支出、进出口贸易等。设经济增长指标为母序列,其他因素为子序列。
请输入初始矩阵,第一列为母序列,其余为子序列。
请输入矩阵的行数: 5
请输入矩阵的列数: 4
请依次输入每一行的元素,用逗号分隔。
第 1 行: 100,80,60,70
第 2 行: 120,90,70,80
第 3 行: 130,100,80,90
第 4 行: 150,120,90,100
第 5 行: 180,150,100,120
每一列与母序列的灰色关联系数为:
[0.78387097 0.68478261 0.72727273]
从结果可以看出,固定资产投资、消费支出、进出口贸易与经济增长的关联程度不同,通过灰色关联系数的大小可以直观地比较各因素与经济增长的关联紧密程度。
本文通过详细的代码示例展示了如何使用 Python 实现灰色关联分析。从数据输入、预处理到最终计算灰色关联系数,每个步骤都进行了清晰的阐述。灰色关联分析在数据分析和决策领域具有广泛的应用,能够帮助我们在数据有限的情况下挖掘因素之间的潜在关系。通过本文的代码,读者可以轻松地将灰色关联分析应用到自己的实际项目中,为解决问题提供有力的支持。在实际应用中,还可以根据具体需求对代码进行进一步优化和扩展,例如改变数据预处理方法或调整分辨系数等,以适应不同的分析场景。