首先进行KMO检验以及球形检验,对一级指标下的这些二级指标判断相关性,从而选择降维方法。这里主要采用主成分分析法对多维指标进行降维,对于主成分分析法通常来讲,指标之间联系越大,降维效果越好。因此,我们使用KMO检验和Bartlett球形检验提前对指标验证,判断指标之间的关系。对于没有经过KMO检验和Bartlett球形检验的指标,我们采用t-SNE方法,将多维非线性的指标降维二维序列,以此达到降维的目的。
其中,KMO检验和Bartlett球形检验,来判定收集各项指标之间的共线性或相关关系。
将数值化处理后结果,导入SPSS进行多维指标KMO检验和Bartlett球形检验得到结果如下所示。
KMO检验和Bartlett的检验 | 物理特性 | 环境适应性 | 使用体验 | |
KMO值 | 0.363 | 0.27 | 0.458 | |
Bartlett球形度检验 | 近似卡方 | 35.837 | 11.244 | 1.206 |
df | 21 | 6 | 3 | |
P | 0.046** | 0.162 | 1.503 | |
注:***、**、*分别代表1%、5%、10%的显著性水平 |
三类指标均为通过检验,因此 使用t-sne进行降维
结果如下所示
降维后结果 | ||
使用体验 | 环境适应性 | 物理特性 |
129.1120758 | 773.6479492 | 825.1612549 |
168.480957 | 481.8232422 | -2.038263798 |
79.30264282 | -85.80281067 | -536.1644897 |
95.75248718 | -689.5393677 | 1165.208374 |
问题二收集数据如下所示
长度 (L) | 直径 (d) | 表面积密度 (S) | 热导率 (λ) |
7 | 30 | 0.04 | 0.1 |
6 | 19 | 0.02 | 0.1 |
18 | 25 | 0.04 | 0.1 |
23 | 27 | 0.04 | 0.11 |
绘制矩阵热力图如下所示
问题二数据介绍+来源
纤维的保暖能力(F)视为纤维的密度(ρ)、长度(L)、直径(d)、热导率(λ)和表面积密度(S)的乘积
纤维密度:纤维的密度越大,单位体积内的纤维数量越多,衣物的保暖能力越强。指单位体积内纤维的质量。密度高的纤维在相同体积下具有更多的物质,可能会提供更好的保暖性,因为它们能更有效地阻挡热量流失。
纤维长度:纤维的长度越长,衣物内的纤维交织程度越高,保暖能力越强。纤维的长度可能会影响其整体的保暖性能,特别是在纺织品中纤维如何互相纠缠以及形成保暖空气层的能力。
纤维直径:纤维的直径越小,衣物内的纤维交织程度越高,保暖能力越强。纤维的直径影响其细腻度以及纤维间空隙的大小,这些空隙可以捕获空气,增加保暖性。
纤维热导率:纤维的热导率越小,衣物内的热量传递越慢,保暖能力越强。这是衡量材料传导热量的能力的物理量。低热导率的材料更适合用于保暖,因为它们不容易传递热量。
纤维表面积密度:纤维的表面积密度越大,衣物内的纤维交织程度越高,保暖能力越强。指单位面积上纤维的密度。表面积密度高的纤维面料往往更加厚重,可以更好地保持体温,防止热量散失。
https://www.ncei.noaa.gov/maps-and-geospatial-products
https://www.mdpi.com/2073-4360/13/19/3287
https://material-properties.org/pet-density-strength-melting-point-thermal-conductivity/
https://textilelearner.net/polyester-fiber-properties-manufacturing/
https://material-properties.org/pet-density-strength-melting-point-thermal-conductivity/
https://database.texnet.com.cn/db-technology/detail--6459.html
https://www.zhihu.com/question/37736807
import numpy as np
import pandas as pd# 创建数据矩阵
data = np.array([[129.1120758, 773.6479492, 825.1612549],[168.480957, 481.8232422, -2.038263798],[79.30264282, -85.80281067, -536.1644897],[95.75248718, -689.5393677, 1165.208374],[147.3497009, 1456.69043, -265.2684021],[62.37760925, 1090.017578, -1163.998169],[112.1847687, -1054.654053, -825.2636108],[44.32613754, -377.8758545, 531.7950439],[23.33691406, 198.0267639, 261.1568909]
])# 转换为 DataFrame
df = pd.DataFrame(data, columns=["使用体验", "环境适应性", "物理特性"])# 标准化处理,这里使用min-max标准化,同时考虑正负属性(物理特性为负属性)
df_normalized = (df - df.min()) / (df.max() - df.min())
df_normalized['物理特性'] = 1 - df_normalized['物理特性'] # 反转负属性的标准化df_normalized# 计算熵值
def calculate_entropy(df):# 常数,防止对数为负无穷epsilon = 1e-9proportions = df / df.sum()entropy = -np.sum(proportions * np.log(proportions + epsilon), axis=0) / np.log(len(df))return entropy# 计算权重
def calculate_weights(entropy):# 权重是熵值的补数分布的归一化weight = 1 - entropyweight_normalized = weight / weight.sum()return weight_normalized# 计算
entropy = calculate_entropy(df_normalized)
weights = calculate_weights(entropy)# 输出熵值和权重
entropy, weightsimport matplotlib.pyplot as plt
import seaborn as sns# 计算加权标准化值
df_weighted = df_normalized * weights# 计算理想解和负理想解
ideal_solution = df_weighted.max()
nadir_solution = df_weighted.min()plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号# 可视化
plt.figure(figsize=(16, 6))plt.subplot(1, 2, 1)
sns.heatmap(df_normalized, annot=True, cmap='coolwarm', fmt=".2f", cbar_kws={'label': 'Normalized Scores'})
plt.title('Normalized Data')plt.subplot(1, 2, 2)
weights.plot(kind='bar', color='teal')
plt.title('Weights of Criteria')
plt.ylabel('Weight')
plt.xticks(rotation=45)plt.tight_layout()
plt.show()ideal_solution, nadir_solution