数学建模——评价决策类算法Python版(灰色关联分析、主成分分析)

一、灰色关联分析

模型原理

解题步骤 

例题

某公司考虑在几个候选城市中开设新的零售店。公司收集了以下数据,包括候选城市的GDP、人口、交通便利程度、商业发展水平等指标。公司希望使用灰色关联分析法来评估这些指标与零售店成功可能性之间的关系,以确定最佳的开店城市。

以下是候选城市的数据:

步骤1:建立参考序列

选择各指标的最优值作为参考序列X0。

X0 = [3200, 120, 90, 95]

步骤2:数据预处理

由于各指标的量纲不同,需要将原始数据进行无量纲化处理。

步骤3:计算灰色关联系数

计算每个城市指标与参考序列的关联系数。

步骤4:计算灰色关联度

计算每个城市的灰色关联度,即各指标关联系数的加权平均值。

步骤5:根据灰色关联度进行排序

根据灰色关联度对候选城市进行排序,关联度最高的城市即为最佳开店城市。

下面是Python代码实现:

import numpy as np

# 原始数据
data = np.array([[3000, 100, 85, 90],
                 [2800, 120, 80, 85],
                 [3200, 90, 90, 95],
                 [2600, 110, 75, 80]])

# 参考序列
X0 = np.array([3200, 120, 90, 95])

# 数据预处理,无量纲化处理
data_normalized = data / X0

# 计算灰色关联系数
def grey_relation_coefficient(x, y):
    return np.min([abs(y - x[i]) / (np.max(abs(y - x)) + 1e-5) for i in range(len(x))])

# 计算所有城市的关联系数
grey_relation_matrix = np.array([[grey_relation_coefficient(X0, data_normalized[i, j]) for j in range(data.shape[1])] for i in range(data.shape[0])])

# 假设各指标权重相等
weights = np.array([1/4, 1/4, 1/4, 1/4])

# 计算灰色关联度,即各指标关联系数的加权平均值
grey_relation_degree = np.sum(grey_relation_matrix * weights, axis=1)

# 输出结果
print("各城市的灰色关联度:")
for i, degree in enumerate(grey_relation_degree):
    print(f"城市 {chr(65+i)}: {degree:.4f}")

# 排序
sorted_indices = np.argsort(grey_relation_degree)[::-1]
print(f"最佳开店城市是:城市 {chr(65+sorted_indices[0])}")

        这段代码首先进行了数据的无量纲化处理,然后计算了每个城市与参考序列的灰色关联系数,接着计算了灰色关联度,并最后根据关联度对城市进行了排序,找出了最佳的开店城市。在实际应用中,各指标的权重可能需要根据具体情况来确定。

结果

二、主成分分析

 

 

 

import pandas as pd
import numpy as np
# 在Python中导入scipy库中的linalg模块
# scipy 是Python中的一个科学计算库。
# linalg 是线性代数(linear algebra)的缩写,它是数学的一个分支,涉及线性方程、线性函数以及它们通过矩阵和向量空间的表示。
from scipy import linalg

# 读取Excel文件的B:G列,除去第一行(标题)
df = pd.read_excel('棉花产量论文作业的数据.xlsx', usecols='C:G')
print(df)
# df.to_numpy 是 pandas 中 DataFrame 对象的一个方法,用于将 DataFrame 的数据转换为 NumPy 数组。
x = df.to_numpy()
print(x)
# 接下来的步骤与之前相同
# 标准化数据
X = (x - np.mean(x, axis=0)) / np.std(x, ddof=1, axis=0)

# 计算协方差矩阵
R = np.cov(X.T)

# 计算特征值和特征向量
eigenvalues, eigenvectors = linalg.eigh(R)
# 将特征值数组按降序排列
eigenvalues = eigenvalues[::-1]
# 将特征向量矩阵的列按降序排列
eigenvectors = eigenvectors[:, ::-1]

# 计算主成分贡献率和累积贡献率
contribution_rate = eigenvalues / sum(eigenvalues)
# np.cumsum 是 NumPy 库中的一个函数,用于计算数组元素的累积和。
cum_contribution_rate = np.cumsum(contribution_rate)

# 打印结果
print('特征值为:')
print(eigenvalues)
print('贡献率为:')
print(contribution_rate)
print('累计贡献率为:')
print(cum_contribution_rate)
print('与特征值对应的特征向量矩阵为:')
print(eigenvectors)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值