用python导入excel数据,对14列数值型数据利用互信息计算每两个特征之间的互信息值并输出所有互信息值 并将所获得的信息值通过热力学矩阵图展示出来
时间: 2024-09-20 08:09:14 浏览: 12
在Python中,我们可以使用pandas库来导入Excel数据,并使用sklearn库的mutual_info_score函数来计算特征之间的互信息。以下是一个完整的示例:
```python
import pandas as pd
from sklearn.feature_selection import mutual_info_classif as mutual_info_score
import seaborn as sns
import matplotlib.pyplot as plt
# 读取Excel文件
file_path = 'D:\\DOWN2\\PC\\USEPC\\pythonProject2\\TF\\0.1\\0.1无钢名.xlsx'
df = pd.read_excel(file_path, engine='openpyxl')
# 确定数值型列
num_cols = df.select_dtypes(include=['float64', 'int64']).columns.tolist()[:14]
# 初始化一个空列表保存互信息值
all_mutual_info = []
# 计算每对特征的互信息
for i in num_cols:
for j in num_cols[i+1:]:
X = df[[i]].dropna()
Y = df[[j]].dropna()
mi = mutual_info_score(X.values.reshape(-1, 1), Y.values.reshape(-1, 1)) # reshape是因为mutual_info_score需要一维数组
all_mutual_info.append((i, j, mi))
# 打印互信息值
print("\n互信息值:")
for feature1, feature2, mi_value in all_mutual_info:
print(f"{feature1} 和 {feature2}: {mi_value}")
# 创建热力图
plt.figure(figsize=(10, 8))
mi_matrix = [[mi_value] for feature1, feature2, mi_value in all_mutual_info]
sns.heatmap(mi_matrix, annot=True, fmt=".2f", cmap='coolwarm', cbar=False,
xticklabels=[col for col, _ in all_mutual_info],
yticklabels=[col for _, col in all_mutual_info])
plt.title('特征间互信息热力图')
plt.xlabel('特征')
plt.ylabel('特征')
plt.show()
```
这段代码首先导入了必要的库,然后读取Excel文件并选择前14列数值型数据。接着计算每对特征的互信息,并将其存储在一个列表中。最后,它会打印出所有的互信息值,并创建一个热力图来直观地展示特征间的互信息量。热力图的颜色从蓝色到红色表示从低到高的互信息强度。
注意:如果某些特征之间存在缺失值,上述代码会忽略这些组合。如果你想在计算之前填充缺失值,你可以使用pandas的fillna函数。