什么 ML 架构适合固定长度的信号回归?

数据挖掘 机器学习 神经网络 回归 机器学习模型 神经
2021-09-27 21:10:52

我的问题是回归类型 -

如何使用固定长度的信号(80 个数据点)来估计鱼的重量,当鱼游过带有电极的闸门时电阻变化(基本上鱼以 20Hz 记录器通过的 4 秒)?

它是一个尖峰形信号,高度和宽度取决于鱼的大小、速度和与闸门边缘的接近程度,可能还有其他因素,例如水的盐度和温度。

我有一个包含 15 个不同权重的数据集,每个样本有 20-110 个样本,每个样本都有 2 个尖峰,用于我用于测量的 2 组电极(使用 2 组有助于确定鱼的前进方向)。

以下是 340 克鱼实验的电阻读数示例:

340 克鱼实验的电阻读数示例

这是从同一个 340 克鱼实验中提取的尖峰示例:

在此处输入图像描述

如您所见,存在显着差异,这导致我寻找一种神经网络方法,可以将此类信号作为输入并估计鱼的重量。

你知道这样的State of the Art网络吗?你会尝试什么?也许是一种不同的机器学习技术?

谢谢!

编辑:

呈现的数据是后处理的,我使用这个 python 代码(附件)提取了尖峰,所以一些噪音被清除了。我不确定如何更好地清洁它,因为实验者没有记录鱼何时通过门 - 我们所拥有的只是电极信号来推断鱼通过了。

# extracting the spikes 
def get_spikes(data_series_elc1, data_series_elc2, signal_meta):
    window_size = int(signal_meta['freq'])*4
    half_window = int(window_size/2)
    
    std = np.std(data_series_elc1)
    p10 = np.quantile(data_series_elc1, 0.9)
    spikes = []
    i = 0
    while i < len(data_series_elc1)-half_window:
        if data_series_elc1[i] > p10:
            #find next max to fix as the center
            max_indx = np.argmax(data_series_elc1[i:i+window_size]) half_window:i+max_indx+half_window])
            spike_list = [[data_series_elc1[i+max_indx-half_window:i+max_indx+half_window]],[data_series_elc2[i+max_indx-half_window:i+max_indx+half_window]]]
            if len(spike_list[0][0])==window_size:                
                spikes.append(spike_list) 
            
            i = i+max_indx+half_window
        else:        
            i = i+1
    print('Number of Spikes: ',len(spikes))
    return spikes

此外,我提取了最大、宽度、积分和高斯拟合等特征,但线性回归模型只能得到 ~R^2=0.6 => 平均误差约为 103 克整体鱼 [100., 144., 200., 275., 339., 340., 370., 390., 400., 404., 480., 500., 526., 700., 740., 800., 840.],这是相当大的误差。

Vanilla 的全连接神经网络也差不多。

model = keras.Sequential()
model.add(keras.Input(shape=(80,)))
model.add(layers.Dense(40, activation="relu"))
model.add(layers.Dense(10, activation="relu"))
model.add(layers.Dense(1))

所以我希望改善这些结果,有什么想法吗?

1个回答

此类数据的一种常见方法是采用积分并学习转换函数到鱼权重。取积分可以将问题简化为一个数字。

您可能不需要最先进的模型。一般的线性模型可能会挑选出一个信号。