如何加速异常值检测中使用的“for”循环?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我使用以下“for”循环来检测和删除数据集中的异常值。 我将该列作为矩阵 (mBase) 导入,因为这解决了其他问题,然后在循环中运行它。 有没有人有任何建议可以加快速度?目前 2000 条记录需要 3-4 秒,而我正在处理 60,000 条记录。
For( i = 1, i < 2000 + 1, i++,
如果(
基地> 分位数( 0.75, mBase ) + 3.95 * (分位数( 0.75, mBase ) -
分位数( 0.25, mBase )) |基地< 分位数 ( 0.25, mBase ) - 3.95 * (
分位数(0.75,mBase) - 分位数(0.25,mBase)),
基地= [.]
)
);
预先感谢您的回复。
马特
回复:如何加速异常值检测中使用的“for”循环?甚至更快:一次对整个矩阵进行操作并完全避免循环。
mBase = mBase
((q25 - 3.95 * (q75 - q25)) <= mBase <= (q75 + 3.95 * (q75 - q25)));
是逐元素矩阵除法。例如,[10 21]
[5 3] == [2 7]
上面的代码利用了除以 0 会产生缺失值的事实。更通用且速度稍慢的方法是使用 Loc() 函数。
locs = Loc(!((q25 - 3.95 * (q75 - q25)) <= mBase <= (q75 + 3.95 * (q75 - q25))));
mBase[locs] = .;
回复:如何加速异常值检测中使用的“for”循环?这大大改善了。 谢谢您的帮助。
回复:如何加速异常值检测中使用的“for”循环?这应该快得多:
q75 = 分位数(.75,mBase);
q25 = 分位数(.25,mBase);
For( i = 1, i < 2000 + 1, i++,
如果(mBase > q75 + 3.95 * (q75 - q25) |
基地< q25 - 3.95 * (q75 - q25),
基地= [.]
)
);