曲线分类-特征提取(一)

通过对曲线进行数据去噪、标准化、统计特征提取,如3-σ去噪、移动中位数去噪、max-min标准化、z-score标准化、偏度和峰度计算,提升智能告警的准确度。数据描述涉及每分钟点的监测数据,去噪方法包括3-σ和移动中位数,数据标准化用于消除数值大小影响,统计特征关注中心位置、发散程度和波动率,为曲线分类提供依据。

一种异常检测算法很难满足所有的业务类型曲线。若想提高智能告警的准确度,有必要对不同 曲线进行分类,以便于针对不同曲线,应用不同的异常检测算法。那么一条曲线,到底包含了哪些信息,可以帮助我们进行特征提取呢?

数据描述

数据每分钟一个点,一天1440个数据点,每天为一个周期,共7天数据。
测试数据为monitor数据,视图4180,属性231960.
原始数据

数据去噪

常用的去噪方法有:3-σ去噪、移动中位数去噪。

3-σ去噪

数据点与均值相差超过3个标准差,则认为为噪点
噪点数据

移动中位数去噪

用中位数代替均值,用中位数偏差代替标准差,避免极端异常值的影响。通过移动分段中位数,增强局部异常点的探测。

import numpy as np
import pandas as pd
def median_noise_filter(df_data, threshold=15,rolling_median_window=50):
    exceptions = pd.Series()
    df_data['median'] = df_data['value'].rolling(window=rolling_median_window, center=True).median().fillna(method='bfill').fillna(
        method='ffill')
    difference = np.abs(df_data['value'] - df_data['median'])
    median_difference = np.median(difference)
    if median_difference != 0:
        s = difference / float(median_difference)
        exceptions = s[s > threshold]
    return exceptions

移动中位数去噪

移动中位数去噪需要选择合适的滑动窗口和偏差阈值参数。3-σ简单直接,但会受到极端值的影响

噪点填充

噪点填充为前一个和后一个正常点的均值

数据标准化(归一化)

将数据按比例缩放,去除数据的单位限制,将其转化为无量纲的纯数值,专注于曲线的形状识别,而不关心曲线上点数值的大小。

max-min标准化

对原始数据的一种线性变换,使原始数据映射到[0-1]之间,指将原始数据的最大值映射成1,是最大值归一化

x=xminmaxmin x ∗ = x − m i n m a x − m i n

max-min归一化

z-score标准化

根据原始数据的均值和标准差进行标准化,经过处理后的数据符合标准正态分布,即均值为0,标准差为1.本质上是指将原始数据的标准差映射成1,是标准差归一化。曲线数值表示该点与均值相差的标准差的数据量:

x=xμσ x ∗ = x − μ σ

曲线值反映了数据点与均值相差的标准差个数。
z-score归一化

统计特征

中心位置

借由中心位置,可以知道数据的一个平均情况。数据的中心位置可分为均值(Mean),中位数(Median),众数(Mode)

  • 均值:表示统计数据的一般水平。受到极端值影响
  • 中位数:在 n 个数据由大到小排序后,位在中间的数字,不受极端值影响
  • 众数:一组数据中出现次数最多的数据值,不受极端值影响、非数值性数据同样适用

发散程度

数据的发散程度可用极差或全距(R)、方差(Var)、标准差(STD)、变异系数(CV)来衡量.

R=xmaxxmin
### 使用1D-CNN提取曲线特征的方法 1D-CNN(维卷积神经网络)是种专门用于处理维数据(如时间序列、信号等)的深度学习模型。通过卷积操作,1D-CNN可以从输入数据中提取局部特征,并利用这些特征进行分类或预测任务。以下是个使用1D-CNN提取曲线特征的完整实现方法[^1]。 #### 数据准备 在训练1D-CNN之前,需要将曲线图转换为适合模型输入的格式。假设曲线图由系列点组成,每个点对应个时间步长和个值,则可以将这些点组织成个形状为 `[batch_size, seq_len, input_size]` 的张量,其中: - `batch_size` 是批量大小。 - `seq_len` 是时间序列的长度。 - `input_size` 是每个时间步长的特征维度。 ```python import numpy as np import torch import torch.nn as nn import torch.optim as optim # 示例:生成随机曲线图数据 np.random.seed(42) data = np.random.randn(100, 50, 1) # 100个样本,每个样本有50个时间步长,每个时间步长有1个特征 labels = np.random.randint(0, 2, size=(100,)) # 假设有两类标签 ``` #### 模型定义 下面是个简单的1D-CNN模型定义,包含卷积层、池化层和全连接层。 ```python class CNN1D(nn.Module): def __init__(self, input_size, num_classes): super(CNN1D, self).__init__() self.conv1 = nn.Conv1d(in_channels=input_size, out_channels=16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() self.pool = nn.MaxPool1d(kernel_size=2, stride=2) self.fc = nn.Linear(16 * 25, num_classes) # 根据卷积和池化后的输出调整线性层输入 def forward(self, x): x = self.conv1(x) # 卷积操作 x = self.relu(x) # 激活函数 x = self.pool(x) # 池化操作 x = x.view(x.size(0), -1) # 展平 x = self.fc(x) # 全连接层 return x # 初始化模型 model = CNN1D(input_size=1, num_classes=2) ``` #### 训练过程 使用交叉熵损失函数和Adam优化器对模型进行训练。 ```python # 转换为PyTorch张量 data_tensor = torch.tensor(data, dtype=torch.float32).permute(0, 2, 1) # 调整维度以适应卷积层 [batch_size, input_size, seq_len] labels_tensor = torch.tensor(labels, dtype=torch.long) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练循环 epochs = 10 for epoch in range(epochs): optimizer.zero_grad() # 清零梯度 outputs = model(data_tensor) # 前向传播 loss = criterion(outputs, labels_tensor) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}') ``` #### 特征提取 如果仅希望提取特征而不进行分类,可以在卷积层后停止计算,并保存中间结果。 ```python def extract_features(model, data_tensor): with torch.no_grad(): x = model.conv1(data_tensor) x = model.relu(x) x = model.pool(x) x = x.view(x.size(0), -1) return x.numpy() features = extract_features(model, data_tensor) print("提取的特征形状:", features.shape) ``` ### 注意事项 - 在实际应用中,可能需要根据具体问题调整卷积核大小、步幅、填充方式等超参数[^2]。 - 如果曲线图数据较为复杂,可以考虑增加卷积层数量或引入残差连接[^3]。 - 对于大规模数据集,建议使用GPU加速训练过程。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值