У меня большой 2D-набор данных (.csv) со значениями от датчика давления. Первое значение - это значение давления, а второе записывает время, когда была предпринята мера. Глядя на график, я вижу группу точек (из-за шума), где вы можете обнаружить некоторые линейные части (то есть «хорошая рабочая зона») и нелинейные зоны. Я думал использовать алгоритм RANSA C для обнаружения линейных зон, но я не уверен, что это лучший способ. С помощью OpenCV я могу изолировать линейный путь, и он, кажется, работает хорошо, но моя проблема заключается в преобразовании двумерного набора данных в «мат»: мой датчик выдает мне 32-битные значения, и тесты занимают дни со скоростью передачи данных менее секунды, поэтому итоговая 2d-матрица это огромный набор 0-1! Итак, по вашему мнению, каков наилучший способ обнаружения линейных шаблонов в наборе 2d-данных?
edit: отправка реального набора данных весьма проблематична c из-за его веса (около 100 МБ) и времени нужно пройти тест (дней). Я могу отправить сюжет, чтобы показать мою проблему.
Как видите, RANSA C работает хорошо, но я боюсь, что такой набор данных, как этот: может привести к ошибочным результатам (первая линейная часть не обнаружена).
Идея состоит в том, чтобы "разбить" мой набор данных по частям, но он не кажется очень эффективным ... Есть ли способ обнаружения нескольких линейных зон с помощью RANSA C?
PS Вот пример код Python для RANSA C
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from skimage.measure import LineModelND, ransac
// x,y are vectors:
// x -> time value
// y -> pressure value @xtime
data = np.column_stack([x, y])
model = LineModelND()
model.estimate(data)
model_robust, inliers = ransac(data, LineModelND, min_samples=2, residual_threshold=0.01, max_trials=1000)
outliers = inliers == False
line_x = np.arange(x.min(), x.max()+1)
fig, ax = plt.subplots()
ax.plot(data[inliers, 0], data[inliers, 1], '.b', alpha=0.6,label='Linear Data')
ax.plot(data[outliers, 0], data[outliers, 1], '.r', alpha=0.6,label='Non Linear Data')
ax.legend(loc='lower right')
plt.show()