<think>嗯,用户需要从XJTU-SY数据集中提取特征的Python代码示例。首先,我得回忆一下XJTU-SY数据集的结构和常见特征提取方法。根据引用[3],这个数据集包含三种工况下15个轴承的全寿命振动信号,所以数据可能是时间序列的。
用户提到特征提取,通常包括时域、频域和时频域特征。时域方面,常见的如均值、RMS、峰值等,引用[2]提到时域和频域谱例程,可能用户需要相关的代码。频域可能需要FFT变换,然后计算特征如重心频率、均方频率等。时频域的话,小波变换可能是常用的方法。
接下来要思考如何组织代码。首先需要读取数据,用户提供的引用[1]中有csv_read函数的使用示例,可能数据存储为CSV文件。因此,代码可能需要用pandas或numpy读取CSV。然后,特征提取部分需要分步骤处理每个信号段,计算各个特征。
还要注意引用[2]中提到时间轴和频谱幅值的匹配,所以在进行FFT时需要正确计算频率轴,并确保幅值正确。另外,引用[1]中的绘图代码可能可以作为参考,显示信号和频谱,帮助用户验证数据。
可能的问题是如何处理全寿命周期数据,是否需要滑动窗口分段?用户可能需要将长时间序列分成多个窗口来计算特征。例如,每个窗口1024个点,然后计算特征,形成特征矩阵。
然后,代码示例应包括数据读取、预处理(如去噪)、特征计算函数(时域、频域)、可能的可视化,以及保存特征。同时,需要引用相关的库,如numpy、pandas、scipy和matplotlib。
需要确保代码正确性,比如FFT后取绝对值,计算单边频谱,频率轴的正确生成。时域特征函数需要逐个实现,比如RMS是均方根,峰峰值是最大值减最小值等。
用户可能需要示例代码的结构,所以分步骤写函数比较清晰。此外,考虑用户可能需要扩展其他特征,所以代码结构应模块化,方便添加新特征。
最后,相关问题部分需要考虑用户可能进一步的问题,比如特征选择方法、处理非平稳信号、降维技巧等,这些都可以作为相关问题提出。</think>### 从XJTU-SY数据集提取特征的Python实现方法
#### 1. 数据读取与预处理
根据引用[1]的示例代码,首先需要读取CSV格式的振动信号数据:
```python
import pandas as pd
import numpy as np
from scipy import signal
from scipy.fft import fft
def load_vibration_data(filepath):
"""读取CSV文件中的水平/垂直振动信号"""
df = pd.read_csv(filepath)
return df['Horizontal'].values, df['Vertical'].values
# 示例调用
data_h, data_v = load_vibration_data("Bearing1_1.csv")
```
#### 2. 特征提取框架
基于引用[2][3]的时频域分析要求,建议实现以下三类特征:
```python
def extract_time_features(signal):
"""时域特征提取"""
features = {
'RMS': np.sqrt(np.mean(signal**2)), # 均方根值
'Peak': np.max(abs(signal)), # 峰值
'Kurtosis': signal.kurtosis(), # 峭度
'CrestFactor': np.max(abs(signal))/np.sqrt(np.mean(signal**2))
}
return features
def extract_freq_features(signal, fs):
"""频域特征提取"""
n = len(signal)
freq = np.fft.rfftfreq(n, d=1/fs)
fft_vals = abs(fft(signal)[:len(freq)])
features = {
'CentroidFreq': np.sum(freq * fft_vals) / np.sum(fft_vals),
'RMSFreq': np.sqrt(np.mean(fft_vals**2)),
'DominantFreq': freq[np.argmax(fft_vals)]
}
return features
def extract_wavelet_features(signal):
"""小波包分解特征"""
wp = signal.WaveletPacket(data=signal, wavelet='db4', mode='symmetric')
energy = [np.sum(node.data**2) for node in wp.get_level(3, 'natural')]
return {'WaveletEnergy': energy}
```
#### 3. 全流程示例
```python
def feature_extraction_pipeline(data, fs=25600):
"""全流程特征提取"""
# 预处理:带通滤波(根据引用[2]的冲击信号特性)
b, a = signal.butter(4, [1000, 12000], btype='bandpass', fs=fs)
filtered = signal.filtfilt(b, a, data)
# 特征融合
time_feat = extract_time_features(filtered)
freq_feat = extract_freq_features(filtered, fs)
wavelet_feat = extract_wavelet_features(filtered)
return {**time_feat, **freq_feat, **wavelet_feat}
# 应用示例
features_h = feature_extraction_pipeline(data_h)
features_v = feature_extraction_pipeline(data_v)
```
#### 4. 特征可视化
参考引用[1]的绘图方法,可添加频谱验证:
```python
import matplotlib.pyplot as plt
def plot_spectrum(signal, fs, title):
n = len(signal)
freq = np.fft.rfftfreq(n, d=1/fs)
fft_vals = abs(fft(signal)[:len(freq)])
plt.figure()
plt.plot(freq, fft_vals)
plt.title(title)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Amplitude')
plot_spectrum(data_h, 25600, "Horizontal Vibration Spectrum")
```