输入特征相关性分析
在训练神经网络之前,可以使用相关性矩阵来分析输入特征之间的相关性,以识别可能的冗余特征或强相关特征对。
可以使用热图来可视化特征间的相关性矩阵。
要使用Python来创建一个热图来可视化特征间的相关性矩阵,你可以使用pandas库来计算相关性矩阵,以及seaborn和matplotlib库来绘制热图。以下是实现这一功能的步骤和示例代码:
-
导入所需的库:
首先,需要导入pandas, numpy, matplotlib, 和seaborn库。 -
准备数据:
假设已经有了一个包含17个特征的DataFrame。 -
计算相关性矩阵:
使用pandas的 corr() 方法计算DataFrame中数值列的相关性矩阵。 -
绘制热图:
使用seaborn的heatmap()函数来绘制热图,并通过matplotlib来显示。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
class Data_Receive(object):
def __init__(self, number):
self.number = number
self.path = f'data/f15_c/data{number}.csv'
self.data = None
def load_data(self): # 加载CSV文件数据
try:
self.data = pd.read_csv(self.path)
except FileNotFoundError:
print(f"文件未找到: {self.path}")
except pd.errors.EmptyDataError:
print("CSV文件为空")
except Exception as e:
print(f"读取CSV文件时发生错误: {e}")
def convert_to_vectors(self): # 将CSV数据转换为向量
if self.data is None:
self.load_data()
self.data = self.data.dropna(how='all') # 移除包含非数据列的行(例如标题行)
# 将每一列转换为向量,并存储在字典中
vectors = {column: np.array(self.data[column]) for column in self.data.columns}
return vectors
if __name__ == '__main__':
number = 3 # 获取数据
data3 = Data_Receive(number)
data3.load_data()
vectors = data3.convert_to_vectors()
time = vectors[list(vectors.keys())[0]]
alpha = vectors[list(vectors.keys())[1]]
beta = vectors[list(vectors.keys())[2]]
u, v, w = vectors[list(vectors.keys())[3]], vectors[list(vectors.keys())[4]], vectors[list(vectors.keys())[5]]
p, q, r = vectors[list(vectors.keys())[9]], vectors[list(vectors.keys())[10]], vectors[list(vectors.keys())[11]]
phi, theta, psi = vectors[list(vectors.keys())[12]], vectors[list(vectors.keys())[13]], vectors[
list(vectors.keys())[14]]
mach, h = vectors[list(vectors.keys())[15]], vectors[list(vectors.keys())[17]]
delta_a, delta_e, delta_r = vectors[list(vectors.keys())[19]], vectors[list(vectors.keys())[20]], vectors[
list(vectors.keys())[21]]
throttle, thrust = vectors[list(vectors.keys())[22]], vectors[list(vectors.keys())[23]]
input = np.array([u, v, w, p, q, r, alpha, beta, mach, h, delta_a, delta_e, delta_r, throttle])
input = input[:, :238] # 所有行,0-238列
# label = np.array([u[1:], v[1:], w[1:]])
label = np.array([u[1:], v[1:], w[1:]]) # 三行,1-239列
df = np.vstack((input, label))
df = np.transpose(df)
df = pd.DataFrame(df)
# 假设你想要修改的列名如下:
new_column_names = ['u', 'v', 'w', 'p', 'q', 'r', 'alpha', 'beta', 'mach',
'h', 'delta_a', 'delta_e', 'delta_r', 'throttle', 'u_new', 'v_new', 'w_new']
# 然后你可以直接赋值给df.columns
df.columns = new_column_names
# 计算相关性矩阵
corr = df.corr()
# 使用热图来可视化相关性矩阵
plt.figure(figsize=(10, 6)) # 可以根据需要调整图形大小
sns.heatmap(corr, annot=True, fmt=".2f", cmap='coolwarm',
cbar_kws={"shrink": .75}, # 调整颜色条大小
annot_kws={"size": 10}) # 设置注释的字体大小
# 优化显示效果
plt.xticks(rotation=45, ha='right') # 旋转x轴标签并右对齐
plt.yticks(rotation=0) # y轴标签不旋转
print(corr)
# 显示图形
plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
plt.show()
结果图:
打印结果:
u v w ... u_new v_new w_new
u 1.000000 0.124031 -0.178265 ... 0.997988 0.104551 -0.203615
v 0.124031 1.000000 -0.132002 ... 0.124102 0.676460 -0.101262
w -0.178265 -0.132002 1.000000 ... -0.180112 -0.163323 0.729753
p -0.048228 0.068287 -0.076105 ... -0.045377 0.331108 -0.013352
q 0.070641 -0.113819 0.641044 ... 0.075506 -0.262654 0.672820
r 0.025647 -0.294523 0.107513 ... 0.026079 -0.525605 0.158322
alpha -0.400308 -0.105749 0.800124 ... -0.408540 -0.092871 0.609569
beta -0.193609 0.319100 -0.076191 ... -0.193332 0.177604 -0.077615
mach 0.999510 0.117577 -0.189529 ... 0.997163 0.100606 -0.209774
h 0.584653 -0.070951 -0.214343 ... 0.570712 -0.086364 -0.202844
delta_a 0.057654 0.529311 -0.121210 ... 0.066466 0.674740 -0.038060
delta_e 0.004178 0.007671 -0.385452 ... 0.005155 0.074071 -0.528328
delta_r -0.190813 -0.692327 0.042406 ... -0.188444 -0.685034 0.035024
throttle 0.409795 0.101111 -0.299239 ... 0.434177 0.088593 -0.304829
u_new 0.997988 0.124102 -0.180112 ... 1.000000 0.106170 -0.186050
v_new 0.104551 0.676460 -0.163323 ... 0.106170 1.000000 -0.120402
w_new -0.203615 -0.101262 0.729753 ... -0.186050 -0.120402 1.000000
[17 rows x 17 columns]