【问题标题】:dealing with complex data structre value处理复杂的数据结构值
【发布时间】:2014-02-21 18:37:57
【问题描述】:

我有两个坐标值。我正在计算每个坐标的欧几里得距离。我想在这里应用 K-最近邻域算法。

  1. 对于每个坐标,获取与所有其他点的欧几里得距离
  2. 选择最接近最大点的点(从所有点中,选择最接近最大坐标数的点)

        $result2 = mysqli_query($con,"SELECT pcount, ncount from test");
        $result1 = mysqli_query($con,"SELECT pcount, ncount from test");
        $i = 0;
                    $k = 0;
        $min = 0;
        while ($row1 = @mysqli_fetch_array($result1))
        {
            $pcount = $row1['pcount'];
            $ncount = $row1['ncount'];
            echo "pcount is $pcount<br/>";
            echo "ncount is $ncount<br/></br>";
            $a[$i] = $pcount ;
            $b[$i] = $pcount ;
            $j = 0;
            $result2 = mysqli_query($con,"SELECT pcount, ncount from test");
            while ($row2 = @mysqli_fetch_array($result2))
            {
            //echo "j is $j <br/>";
            $a[$j] = $row2['pcount'];   
            $b[$j] = $row2['ncount'];
            $diff = ($a[$i] - $a[$j])^2 + ($b[$i] - $b[$j])^2;
            if( $diff != 0)
                $diff = sqrt( $diff );
                $j= $j + 1;
                echo "$diff <br>";
                            arr[$k] = $diff;
                            $k = $k + 1;
            }               
            //echo "i is $i <br/>";
                $i = $i + 1;    
        }
    

这里,arr[$k] 包含所有点的距离差。 如何在这里获得最接近最大其他点的点。可能有超过 1 个这样的点。

【问题讨论】:

  • 为什么要执行两个相同的数据库查询? $result1$result2 代表相同的数据。所以你只是浪费内存。您必须执行一个查询,获取它的结果为一个数组并在循环中使用该数组。

标签: php arrays algorithm data-structures knn


【解决方案1】:

我建议使用以下方法。

0) 获取 db 数据到二维数组如下:

array(
    array($x1,$y1),
    array($x2,$y2),
    ...
)

1) 构建数组存储每个点到所有其他点的(平方)距离总和。

2) 找出该数组中的最小值(最小值)。

3) 获取所有具有该值的点。

所以代码应该是这样的:

// $a_points = array( array($x1,$y1), array($x2,$y2), ... ); // array of point coordinates

$a_sum_dists = array();
foreach ($a_points as $i => $pt1) {
    list($x1, $y1) = $pt1;
    $sum = 0;
    foreach ($a_points as $j => $pt2) {
        if ($j == $i) continue;
        list($x2, $y2) = $pt2;
        $sum += pow($x2- $x1, 2) + pow($y2- $y1, 2);
    }
    $a_sum_dists[$i] = $sum;
}
$min_sum = min($a_sum_dists);
$a_result_points = array_intersect_key(
    $a_points, 
    array_filter($a_sum_dists, function ($v) use ($min_sum) {
        return $v == $min_sum;
    })
);

Demo

【讨论】:

  • 非常感谢。我想我现在会达到我的目标。但是这里有逻辑上的错误。我们在$a_sum_dists[$i] 中获得了一些分数。但我认为根据最近邻域算法,它应该找到每个点的距离,并从它们那里得到最小距离的坐标。
  • 我不太明白你的笔记。错在哪里?我的算法找到与所有其他点的总距离最短的点。这不是你想要的吗?
  • 谢谢,但我想要一点不同。我想要的是:假设 pint (x1,y1) 有 k 个邻居,然后从所有 k 个点中找到那些距离最小的坐标。可能不止一个。现在我们有了每个坐标的最近点列表。所以现在我们需要找到最常作为最近邻出现的点。最密集的点。
  • 你的问题表述太模糊了。首先,您不应该使用“邻居”一词,因为它完全取决于点之间的距离。在计算所有可能的距离之前,您无法判断某个点是否与其他点相邻。
  • 您的问题不可能是 K-NN 的变体。 K-NN(k-Nearest Neighbors)是一种算法,而不是问题,它旨在解决比您的问题复杂得多的问题。虽然它可以应用于你的问题(一般来说),但它就像用大锤敲碎坚果。
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多