我的问题是回归类型 -
如何使用固定长度的信号(80 个数据点)来估计鱼的重量,当鱼游过带有电极的闸门时电阻变化(基本上鱼以 20Hz 记录器通过的 4 秒)?
它是一个尖峰形信号,高度和宽度取决于鱼的大小、速度和与闸门边缘的接近程度,可能还有其他因素,例如水的盐度和温度。
我有一个包含 15 个不同权重的数据集,每个样本有 20-110 个样本,每个样本都有 2 个尖峰,用于我用于测量的 2 组电极(使用 2 组有助于确定鱼的前进方向)。
以下是 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))
所以我希望改善这些结果,有什么想法吗?

