Как узнать или найти вектор веса и удалить выбросы для всех точек данных, используя Constrained np.polyfit или curve_fit?

Я пытаюсь подогнать exponential decay к некоторым экспериментальным данным и использую polyfit в numpy. Кроме того, сама подгонка взвешена, то есть каждая точка данных имеет некоторый вес, связанный с ней, и polyfit function can find that optimal weights?

Ссылка: Ограниченный np.polyfit

Таким образом, окончательный вывод будет coefficient value и weight vector для каждой связанной точки данных.

Также я хочу ограничить параметр M от 0,9 до 1 и N от -0,001 до -0,009.

Данные:

t(x) rate(y)
0   0.950
1   0.940
2   0.931
3   0.921
4   0.912
5   0.902
6   0.893
7   0.884
8   0.875
9   0.866
10  0.857
11  0.849
12  0.840
13  0.831
14  0.823
15  0.814
16  0.806
17  0.798
18  0.790
19  0.782
20  0.774
21  0.766
22  0.758
23  0.750
24  0.743
25  0.735
26  0.728
27  0.720
28  0.713
29  0.705
30  0.698

Я хочу подобрать ближайшую экспоненциальную кривую к этим данным.

Мой подход:

    def fit_exp_linear(x, y):
            y = np.log(y)
            M, N_log = np.polyfit(t, y, 1)
            N = np.exp(N_log)
            return M, N

Как я могу узнать вес для каждой строки здесь?

Конечный результат, который я хочу: M, N and Weights vector of size dim(x)

Выбросы:

введите здесь описание изображения Есть ли способ сделать это?

Как избавиться от этих выбросов с помощью curve_fit?


person MAC    schedule 17.04.2020    source источник
comment
Все веса равны 1 по умолчанию. Насколько я понимаю, веса полезны для придания меньшего веса данным, которые кажутся менее надежными. Но это то, что вы должны дать в качестве входных данных. Я, как физик, уменьшаю вес очевидных выбросов или артефактов метрологии/чувствования экспериментальных данных. На смоделированных данных я бы выбрал вес на основе диапазонов достоверности используемых моделей.   -  person jkalden    schedule 20.04.2020
comment
Имеет смысл. Разве полифит или кривая_фит не могут сами выбрать вес?   -  person MAC    schedule 20.04.2020
comment
Они делают! Они выбирают 1.0! Вы можете подумать об оценке надежности данных, которая рассчитывает веса на основе определенных вами критериев, а затем использует эти веса в качестве входных данных для подбора! Есть несколько алгоритмов, как идентифицировать выбросы. Они основаны, например. об общих концепциях распределения экстремальных значений... Но, может быть, это что-то для обмена математическими или физическими стеками...   -  person jkalden    schedule 20.04.2020
comment
@jkalden Отредактировал мой вопрос.   -  person MAC    schedule 21.04.2020
comment
Еще раз: вам нужно, чтобы функции выводили то, что им требуется в качестве входных данных. Вы должны искать Как определить выбросы в данных?, и это скорее математика или физика, чем программирование, так что, возможно, попробуйте там.   -  person jkalden    schedule 28.04.2020
comment
Привет! Я не знаю, добился ли ты прогресса. Вот предложение: начните с весов 1. Делайте аппроксимацию, вычисляйте разницу от аппроксимации для каждой точки. Сделайте статистику и для тех точек данных, которые выходят за пределы более чем на 3 сигма, установите вес 0,1. Сделайте это еще раз и установите вес на 0,2 для второго цикла и так далее. Это немного самоисполняющееся пророчество, но вы можете попробовать!   -  person jkalden    schedule 19.05.2020