Обнаружение выбросов из списка - PullRequest
2 голосов
/ 19 марта 2019

Я хочу обнаружить и сохранить выбросы из списка, и это то, что я делаю

Код:

def outliers(y,thresh=3.5):

    m = np.median(y)
    abs_dev = np.abs(y - m)
    left_mad = np.median(abs_dev[y <= m])
    right_mad = np.median(abs_dev[y >= m])
    y_mad = left_mad * np.ones(len(y))
    y_mad[y > m] = right_mad
    modified_z_score = 0.6745 * abs_dev / y_mad
    modified_z_score[y == m] = 0
    return modified_z_score > thresh

bids = [5000,5500,4500,1000,15000,5200,4900]

z = outliers(bids)
bidd = np.array(bids)
out_liers = bidd[z]

Это дает результаты как:

out_liers = array([ 1000, 15000])

Есть ли лучший способ сделать это, когда я получаю результаты не в массиве, а в списке?Также, пожалуйста, может кто-нибудь объяснить мне, почему мы использовали

thresh = 3.5

ified_z_score = 0.6745 * abs_dev / y_mad

Ответы [ 2 ]

1 голос
/ 19 марта 2019

Это работает:

def outliers_modified_z_score(ys, threshold=3.5):
    ys_arr = np.array(ys)
    median_y = np.median(ys_arr)
    median_absolute_deviation_y = np.median(np.abs(ys_arr - median_y))
    modified_z_scores = 0.6745 * (ys_arr - median_y) / median_absolute_deviation_y
    return (ys_arr[np.abs(modified_z_scores) > threshold]).tolist()
1 голос
/ 19 марта 2019

Это потому, что вы используете функцию numpy.Используемый тип по умолчанию - numpy.ndarray, что ускоряет вычисления.В случае, если вам просто нужен список в качестве выходного аргумента, используйте метод tolist().

z = outliers(bids)
bidd = np.array(bids)
out_liers = bidd[z].tolist()
...