Удалить аномалии в массиве Python? - PullRequest
0 голосов
/ 12 марта 2019

Ранее я задавал вопрос о создании эффективного цикла для обнаружения выбросов, и кто-то здесь дал хороший ответ. Тем не менее, я сейчас пишу этот код для поиска выбросов в массиве. Для этой программы предположим, что 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 должны быть удалены.

Что нужно изменить в коде, чтобы отобразить правильный вывод?

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