生成了两组模拟数据以代表正常和故障状态。然后我定义了一个函数来计算给定数据的熵。这个函数首先使用直方图将数据分成多个桶,然后应用scipy.stats模块的entropy函数来计算这些桶的概率分布的熵。
代码中,正常状态数据是围绕一个较小的均值高斯分布生成的,而故障状态数据是围绕同一个均值但具有更高标准差的高斯分布生成的,代表了更大的不确定性和随机性。
最后,我使用matplotlib可视化了这两组数据的直方图和它们的熵。正如可视化结果所显示的,正常状态数据的熵较低,因为数据更加集中;而故障状态数据的熵较高,因为数据更加分散。这说明熵确实可以作为区分不同状态的特征,用于故障诊断和系统健康监测。
学习测试代码
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import entropy
# 模拟数据生成
# 假设我们有两种状态的数据,一种是正常状态,一种是故障状态
np.random.seed(0)
# 正常状态的数据更加有序,因此熵较低
normal_data = np.random.normal(5, 1, 1000)
# 故障状态的数据更加无序,因此熵较高
faulty_data = np.random.normal(5, 10, 1000)
# 计算熵的函数
def calculate_entropy(data):
hist, bin_edges = np.histogram(data, bins=30, density=True)
return entropy(hist, base=2)
# 计算两种状态下的熵
normal_entropy = calculate_entropy(normal_data)
faulty_entropy = calculate_entropy(faulty_data)
# 可视化结果
bins = np.linspace(np.minimum(normal_data.min(), faulty_data.min()),
np.maximum(normal_data.max(), faulty_data.max()), 30)
plt.figure(figsize=(14, 7))
# 正常数据的直方图
plt.subplot(1, 2, 1)
plt.hist(normal_data, bins=bins, color='green', alpha=0.7)
plt.title(f'Normal Data\nEntropy = {normal_entropy:.2f}')
plt.xlabel('Value')
plt.ylabel('Frequency')
# 故障数据的直方图
plt.subplot(1, 2, 2)
plt.hist(faulty_data, bins=bins, color='red', alpha=0.7)
plt.title(f'Faulty Data\nEntropy = {faulty_entropy:.2f}')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.tight_layout()
plt.show()