【发布时间】:2017-03-20 01:23:55
【问题描述】:
我正在构建一个小应用程序,用于分析 ebay 已售商品的历史价格 对于某些关键字/项目,范围非常广泛,因为搜索范围太广或根本错误,被不正确相关的项目感染
例如。
iphone 的搜索价格结果包括手机,但 还有掺假价格数据的充电器和配件/无关物品... 所以我有一个范围,一个充电器 5 美元,一个充电器 500 美元 手机
所以,鉴于我将尝试改进我这边的搜索,我想知道是否有数学计算来排除异常值
说我有
$1200
$549
$399
$519
$9
$599
$549
$9
$499
$399
$519
$99
$5
$5
我如何将价格范围设为 300-600 美元而不是 10-800 美元左右...
她在当前使用的 php 之下...不确定是否是最好的
function remove_outliers($dataset, $magnitude = 1)
{
$count = count($dataset);
$mean = array_sum($dataset) / $count; // Calculate the mean
$deviation = sqrt(array_sum(array_map("sd_square", $dataset, array_fill(0, $count, $mean))) / $count) * $magnitude; // Calculate standard deviation and times by magnitude
return array_filter($dataset, function ($x) use ($mean, $deviation) {return ($x <= $mean + $deviation && $x >= $mean - $deviation);}); // Return filtered array of values that lie within $mean +- $deviation.
}
function sd_square($x, $mean)
{
return pow($x - $mean, 2);
}
function calculate_median($arr)
{
sort($arr);
$count = count($arr);
$middleval = floor(($count - 1) / 2);
if ($count % 2) {
$median = $arr[$middleval];
} else {
$low = $arr[$middleval];
$high = $arr[$middleval + 1];
$median = (($low + $high) / 2);
}
return $median;
}
$prices = remove_outliers($prices); //$prices is the array with all the prices stored
$trend = calculate_median($prices);
$trend = round(($trend));
$min = round(min($prices));
$max = round(max($prices));
【问题讨论】:
-
您无法确定大部分项目都在合理范围内。这就是为什么您的计算会提供结果,但您绝对无法判断该结果是否有意义。在事先不知道估计范围的情况下,您无法进行此类计算。
-
如何将范围与我确定的新商品的当前价格进行比较,具体商品的价格如何?可以作为中心点吗?
-
是的,这是可能的,但前提是您知道这个价格实际上在预期范围内。这只会将问题转移到您是否有可靠的主要来源。
-
当范围太宽(从 1 美元到 1000 美元),或者范围有太多值而不是相同范围内的值时,如何检测/排除?我不是数学家,所以我只是猜测......
-
在不知道数据点拓扑的情况下尝试过滤某些内容是不可能的。