не похоже, что вы получите что-то стоящее после этой процедуры, есть гораздо лучшие методы для обработки неожиданных данных.поиск в Google для «обнаружения выбросов» был бы хорошим началом.
с учетом сказанного, вот как ответить на ваш вопрос:
начните с поиска в библиотеках и получения некоторых данных:
import matplotlib.pyplot as plt
import numpy as np
Y = np.array([
0.00441025, 0.0049001 , 0.01041189, 0.47368389, 0.34841961,
0.3487533 , 0.35067096, 0.31142986, 0.3268407 , 0.38099566,
0.3933048 , 0.3479948 , 0.02359819, 0.36329588, 0.42535543,
0.01308297, 0.53873956, 0.6511364 , 0.61865282, 0.64750302,
0.6630047 , 0.66744816, 0.71759617, 0.05965622, 0.71335208,
0.71992683, 0.61635697, 0.12985441, 0.73410642, 0.77318621,
0.75675988, 0.03003641, 0.77527201, 0.78673995, 0.05049178,
0.55139476, 0.02665514, 0.61664748, 0.81121749, 0.05521697,
0.63404375, 0.32649395, 0.36828268, 0.68981099, 0.02874863,
0.61574739])
X = np.linspace(0, 1, len(Y))
затем сделайте начальный график данных:
plt.plot(X, Y, '.')
, так как это позволит вам увидеть, с чем мы имеем дело иполином всегда подходил бы. Короткий ответ заключается в том, что этот метод не слишком далеко продвинется с данными такого рода
, на этом этапе мы должны остановиться, но чтобы ответить на вопрос I 'Я продолжу, в основном, следуя вашему коду полиномиальной подгонки:
poly_degree = 5
sd_cutoff = 1 # 2 keeps everything
coeffs = np.polyfit(X, Y, poly_degree)
poly_eqn = np.poly1d(coeffs)
Y_hat = poly_eqn(X)
delta = Y - Y_hat
sd_p = np.std(delta)
ok = abs(delta) < sd_p * sd_cutoff
, надеюсь, это имеет смысл, я использую полином более высокой степени и только отсечение в 1SD, потому что иначе ничего не будет выброшено.массив ok
содержит True
значения для тех точек, которые находятся в пределах sd_cutoff
стандартных отклонений
, чтобы проверить это, я бы тогда сделал другой график.что-то вроде:
plt.scatter(X, Y, color=np.where(ok, 'k', 'r'))
plt.fill_between(
X,
Y_hat - sd_p * sd_cutoff,
Y_hat + sd_p * sd_cutoff,
color='#00000020')
plt.plot(X, Y_hat)
, что дает мне:
, поэтому черные точки являются точками для сохранения (то есть X[ok]
возвращает мне это, а np.where(ok)
дает вам указание).
вы можете поиграться с параметрами, но вы, вероятно, захотите распределение с более толстыми хвостами (например, T-распределение Стьюдента), но, как ясказал выше, использование Google для обнаружения выбросов будет моим предложением