我想从列表中检测并存储离群值,这就是我正在做的
代码:
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
modified_z_score = 0.6745 * abs_dev / y_mad
答案 0 :(得分:1)
那是因为您正在使用numpy
函数。使用的默认类型为numpy.ndarray
,可加快计算速度。如果您只需要一个列表作为输出参数,请使用tolist()
方法。
z = outliers(bids)
bidd = np.array(bids)
out_liers = bidd[z].tolist()
答案 1 :(得分:1)
这有效:
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()