LINUX.ORG.RU

Какой функцией можно пофиттить такую фигню?

 curve fitting,


1

3

Есть куча событий такого вида: https://i.imgur.com/szyvheQ.png (циферки).

Высота «хвостов» варьирует относительно друг друга. Функцией какого вида можно точнее всего пофиттить такую загогулину? У меня на такие вещи голова плохо заточена, у кого с математической смекалкой получше, выручайте.

★★★★★

Последнее исправление: Axon (всего исправлений: 1)
Ответ на: комментарий от psv1967

Понятно, что записи уже сделаны, я еще пытаюсь. Если что получиться приемлемое сюда отпишу.

Спасибо.

И все таки проблема в потоке. Вот пишут о ней, рекламируя замену перистальтическому насосу http://www.elveflow.com/microfluidic-tutorials/cell-biology-imaging-reviews-a...

Нет, там немного про другое. Колебания потока у меня есть, но они мне не мешают. Они регулярные, в отличие от помехи, и частота их намного ниже.

Если наливать насосом в воронку, а уже она нужной высотой столба будет стабильно прокачивать кювету (ну и на выходе просто сливать в другую воронку), то проблема обязана уйти?

Возможно, но это принесёт кучу других проблем. Нельзя быстро сменить раствор, нельзя остановить/запустить проток одним махом, трудно контролировать соотношение скорости притока и оттока... К тому же, мне нужен проток не медленнее 5 мл/мин, а для этого приточную воронку придётся почти под потолок вешать. Я с такими вариантами экспериментировал, это неюзабельно.

Axon ★★★★★
() автор топика
Последнее исправление: Axon (всего исправлений: 2)

Хм, а попробовать «выключить» сигнальную область и разложить в фурье? Вот тебе и функция для описания фона. С сигнальной функцией здесь народ уже вроде предлагал производную от Гаусса. Я могу добавить, что если сигнал асимметричный, то есть штука, называется «логарифмический» Гаусс. Формуль сейчас точно не вспомню, у ней есть третий параметр — асимметрия. Если интересно, постараюсь найти в своих записях двухлетней давности.

luke ★★★★★
()
Ответ на: комментарий от luke

Хм, а попробовать «выключить» сигнальную область и разложить в фурье? Вот тебе и функция для описания фона.

Про отсечки по частотам выше писал, не катит, к сожалению.

Я могу добавить, что если сигнал асимметричный, то есть штука, называется «логарифмический» Гаусс.

Логнормальное распределение.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

1. Нет, вырезать именно по времени кусок с сигналом. Ты же его глазом видишь хорошо?

2. У логнормального распределения нет параметра асимметрии, только sigma и mu. Логарифмический Гаусс имеет.

luke ★★★★★
()
Ответ на: комментарий от Axon

Функция применяется для фита энерговыделения фотона в электромагнитном калориметре.

Double_t loggaussian (Double_t *x, Double_t *p) 
{
  Double_t E = x[0];
  Double_t Ampl = p[0];
  Double_t E_p = p[1];
  Double_t sigma = p[2];
  Double_t eta = p[3];
  
  if (Ampl < 0)
    Ampl = -Ampl;
  Double_t xi = 2.35;
  Double_t xxx = (1-eta*(E-E_p)/sigma);
  if (xxx <0){
    xxx=0;
  }
  Double_t s_0 = 2/xi*ASinH (eta*xi/2);
  Double_t Val = Ampl*exp(-(sqr(log(xxx))/2/sqr(s_0)) - sqr(s_0)/2)*eta/Sqrt(2*Pi())/sigma/s_0;
  return Val;
}
luke ★★★★★
()
Ответ на: комментарий от luke

1. Нет, вырезать именно по времени кусок с сигналом. Ты же его глазом видишь хорошо?

А что мне тогда даст дискретное фурье?

2. У логнормального распределения нет параметра асимметрии, только sigma и mu.

Ой, точно.

Axon ★★★★★
() автор топика
Ответ на: комментарий от luke

Ты опишешь фон суммой синусов.

Но зачем? Данные события я хочу описать чтобы их вычесть из записи, потому что это помеха, и я хочу от неё избавиться. Кроме неё на фоне есть события другого рода, которые-то мне и нужны.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

Вообще то тебе надо просто отбросить точки сильно выбивающиеся из последовательности.

Т.е. «фильтр» примерно такой:

if abs(x[n] - x[n-1]) > epsilon {
   skip
}
beastie ★★★★★
()
Ответ на: комментарий от Axon

А, то есть фон — вон та вот загогулина, а «синусы» справа и слева — полезный сигнал? Тогда оставляю только идею про логарифмический Гаусс.

luke ★★★★★
()
Ответ на: комментарий от beastie

Вообще то тебе надо просто отбросить точки сильно выбивающиеся из последовательности.

Пробовал, не катит. К тому же, их нельзя отбрасывать, надо чем-то заменять.

Axon ★★★★★
() автор топика
Ответ на: комментарий от luke

А, то есть фон — вон та вот загогулина, а «синусы» справа и слева — полезный сигнал?

Наоборот. Фон - это шум базовой линии, медленная загогулина - полезный сигнал, а быстрые большие пики - помеха.

Axon ★★★★★
() автор топика
Ответ на: комментарий от Axon

медленная загогулина - полезный сигнал, а быстрые большие пики

Имхо в этом кроется решение. Тебе нужен ФВЧ. Математически скорей всего через Фурье.

Потыкай matlab — там имхо всё это уже есть.

Физически — вставь дроссель в линию. ;)

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Имхо в этом кроется решение. Тебе нужен ФВЧ.

Выше по треду много раз обсудили. ФВЧ помнёт мне полезный сигнал, а это не вариант.

Потыкай matlab — там имхо всё это уже есть.

Я тыкаю в питон, там тоже есть.

Физически — вставь дроссель в линию. ;)

С пэтч-усилителями такое не прокатывает, обратная связь жы. К тому же, сигнал и так пропущен через аппаратный ФВЧ с максимально допустимой частотой среза, сильнее его фильтровать без искажений нельзя.

Axon ★★★★★
() автор топика
Последнее исправление: Axon (всего исправлений: 1)

Вроде что то начинает получаться.

Но есть одно «но»: техника предполагает «сваливание» всех нужных событий в один датасет и обучение по нему с помощью https://cran.r-project.org/web/packages/rNMF/vignettes/rNMF.html (ну или другой разновидности NMF)

Если событий немного, то оно выделить все разновидности полезных шаблонов не в состоянии. По идее должно улучшиться подгонка события если завести большую «библиотеку правильных событий» и добавляя к ней новые «плохие» их чистить...

Еще мне показалось, что оно переставляет местами сигналы в выхлопе... может действительно надо сед выбирать как в мануале.


> str(data)
'data.frame':	250000 obs. of  2 variables:
 $ V1: num  0 0.02 0.04 0.06 0.08 0.1 0.12 0.14 0.16 0.18 ...
 $ V2: num  -0.157 -0.155 -0.157 -0.161 -0.16 ...


> datapoints
 [1]  914.5402 1086.9601 1119.6000 2067.4402 2344.5203 2689.8000 2799.5203
 [8] 3049.1602 3419.6201 3500.5002 4029.9795 4160.1602 4347.1401 4388.9600
[15] 4599.7407 4898.4395 4960.9795

my.get.event <- function(i) { ii <- max(which(datapoints[i] > data$V1)) ; data$V2[(ii - 0 ):(ii + 400)] }

library(rNMF)

res <- rnmf(sapply(1:length(datapoints), my.get.event)[-1,]+1, k = 2, showprogress = FALSE)

my.show.res <- function(i) {plot(res$fit[,i], type="l"); lines((sapply(1:length(datapoints), my.get.event)[-1,]+1)[,i], type="l", col="red")}

my.show.res(1)
my.show.res(17)



my.show.res2 <- function(i) {plot(res2$fit[,i], type="l"); lines((sapply(1:length(datapoints), my.get.event)[-1,]+1)[,i], type="l", col="red")}

my.show.res(1)

psv1967 ★★★★★
()
Ответ на: комментарий от psv1967

И вариант с чисткой забыл :(

res2 <- rnmf(sapply(1:length(datapoints), my.get.event)[-1,]+1, k = 2, showprogress = FALSE, tol = 0.0001, maxit = 50)

всё

psv1967 ★★★★★
()

sin(x)*exp(-x^2) попробуй.

dikiy ★★☆☆☆
()

это помехи, которыми засрана вся запись

открываешь audacity, выбираешь удаление шума

Там тебе предложат сначала выбрать участок ТОЛЬКО с шумами, потом то, откуда тебе нужно убрать шумы

все остальное сделает за тебя программа. Не нужно изобретать велосипед

reprimand ★★★★★
()
Ответ на: комментарий от Axon

Помеха идёт не от электроники насоса, потому что при работающем моторе, но без тока жидкости (например, если полностью убрать прижим трубок), её нет.

а что если это какая-то стоячая волна?

dikiy ★★☆☆☆
()

кстати, как идея - попробуй может наоборот. То есть есть функция, которая описывает полезный сигнал, и аппроксимируй ею.

dikiy ★★☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.