Обнаружение линейных зон из 2d набора данных - PullRequest
1 голос
/ 10 января 2020

У меня большой 2D-набор данных (.csv) со значениями от датчика давления. Первое значение - это значение давления, а второе записывает время, когда была предпринята мера. Глядя на график, я вижу группу точек (из-за шума), где вы можете обнаружить некоторые линейные части (то есть «хорошая рабочая зона») и нелинейные зоны. Я думал использовать алгоритм RANSA C для обнаружения линейных зон, но я не уверен, что это лучший способ. С помощью OpenCV я могу изолировать линейный путь, и он, кажется, работает хорошо, но моя проблема заключается в преобразовании двумерного набора данных в «мат»: мой датчик выдает мне 32-битные значения, и тесты занимают дни со скоростью передачи данных менее секунды, поэтому итоговая 2d-матрица это огромный набор 0-1! Итак, по вашему мнению, каков наилучший способ обнаружения линейных шаблонов в наборе 2d-данных?

edit: отправка реального набора данных весьма проблематична c из-за его веса (около 100 МБ) и времени нужно пройти тест (дней). Я могу отправить сюжет, чтобы показать мою проблему. myplot

Как видите, RANSA C работает хорошо, но я боюсь, что такой набор данных, как этот: myplot может привести к ошибочным результатам (первая линейная часть не обнаружена).
Идея состоит в том, чтобы "разбить" мой набор данных по частям, но он не кажется очень эффективным ... Есть ли способ обнаружения нескольких линейных зон с помощью 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()

...