Ранее я задавал вопрос о создании эффективного цикла для обнаружения выбросов, и кто-то здесь дал хороший ответ. Тем не менее, я сейчас пишу этот код для поиска выбросов в массиве. Для этой программы предположим, что array = x_a, а точка данных - x. Mu является средним значением x_a БЕЗ значения данных, а сигма является стандартным отклонением x_a БЕЗ точки данных. Если точка данных является аномальной, она удаляется из x_a. В приведенном ниже коде я пытаюсь сделать это. Я создал набор данных x_a и x_trimmed (предполагается, что это набор данных БЕЗ точки x, как требуется). Ниже приведен код и вывод.
import numpy as np
x_a = np.array([([99.5697438, 94.47019021, 55.0, 106.86672855, 102.78730151,
131.85777845, 88.25376895, 96.94439838, 83.67782174,
115.57993209, 118.97651966, 94.40479467, 79.63342207, 77.88602065,
96.59145004, 99.50145353, 97.25980235, 87.72010069, 101.30597215,
87.3110369, 110.0687946, 104.71504012, 89.34719772, 160.0,
110.61519268, 112.94716398, 104.41867586])
outliers=True
while outliers:
#Define mean and std of the dataset
x_mu = np.mean(x_a, axis=0)
x_std = np.std(x_a, axis=0)
#Define the dataset WITHOUT the data point, and calculate the mean and std WITHOUT the datapoint
x_trimmed = [x for x in x_a if (x < x_mu + (3 * x_std)) or (x > x_mu - (3 * x_std))]
trim_mu = np.mean(x_trimmed, axis=0)
trim_std = np.std(x_trimmed, axis=0)
for cell in x_a:
if cell > x_mu + (3 * x_std) or cell < x_mu - (3 * x_std):
print("Removed the data point " + str(cell))
index=np.where(x_a==cell)
x_a = np.delete(x_a, obj=index)
if np.array_equal(x_a, x_trimmed):
print("No more outlier detected!")
outliers=False
Однако, вывод ниже:
Removed the data point 160.0
No more outlier detected!
Я вручную удалил точки данных 55.0 и 131.85777845 и обнаружил, что точка 131.85777845 действительно составляет около 3.07 стандартных отклонений от среднего значения. Ожидаемый результат - 160, 55 и 131.85777845 должны быть удалены.
Что нужно изменить в коде, чтобы отобразить правильный вывод?