求出两个不同长度数组的欧式距离

Find euclidean distance of two array of different length

我想求欧氏距离来检查字符串的相似度。

从上图一个绘画对象域的图片来看,数据库中有很多图片类型。正在使用此 paining_object 字段显示图像。现在我想通过比较 paining_object 字段中的字符串来显示一张所选图像的相关图像。所以我用欧几里得距离法来寻找字符串的相似性。

但是我遇到了长度问题。对于前。在数据库的第一行中, paining_object 字段中有四种图像类型,第二行中有四种以上的图像类型。那么,对于长度不等的数组,如何使用这种方法测量距离。

我们不能在这里申请 Euclidean Distance 因为:

  • 数组长度可以不同
  • 不考虑字符串的顺序。例如,hellsing 可以在数组中的任何索引处。所以,我们不应该只比较第一个数组的第一个元素和第二个数组的第一个元素。

相反,我们可以定义一个相似度函数来解决上述两个问题 - 我们可以使用字符串匹配数与组合总数的比率作为相似度得分。

// Assuming $firstArr and $secondArr are sets, i.e., don't contain duplicates
function similarityScore($firstArr, $secondArr) {
    $matchCount = 0;
    foreach ($firstArr as $first) {
        foreach($secondArr as $second) {
            if ($first == $second) {
                $matchCount++;
            }
        }
    }
    return $matchCount/(count($firstArr)*count($secondArr));
}

此函数returns [0,1] 范围内的实数,其中较高的值表示较大的相似性。

非欧氏距离

两个无序数组之间的距离可以改写为集合之间的距离。

快速查找显示存在几个表示集合之间相似性的距离,例如

  • Jaccard距离

    d(a,b) = |a 中间 b| / |联合 b|

  • 最大差异指标

    d(a,b) = 1 - |a 中间 b| / 最大值(|a|, |b|)

纸上有更多的距离(例如)Distances between sets on set commonality

仍然是欧氏距离

你还可以强制:

将你所有的漫画作为词汇 V,说大小 n。 考虑集合 R^n.

您的 table 的一行可以表示为 R^n 的向量 v: 如果该行包含单词 i,则输入 v[i] = 1v[i]=0 否则

最后,欧氏距离可以简单地应用于相同长度的向量。

距离如此

d(a,b) = || v_b - v_a ||_2 = sqrt( (v_b[0] - v_a[0])^2 + ... + (v_b[n-1] - v_a[n-1)^2)

每个正方形都等于 1 当且仅当 v_b[i]!=v_a[i] 即您要计算 a 中的元素而不是 b U b not in a 同上ab.

的对称差异

因此您可以改写您的距离:

d(a,b) = sqrt(|a Δ b|)

我已经通过使用如下的 Jaccard 距离来做到这一点。首先为唯一对象创建了两个表,从中我们可以从 id 收集对象,第二个表中所有对象聚集在一起,与 (,)

分开

1) image_sub_main Table

2) image_main Table

3) PHP Wordpress 方式的文件

global $wpdb;
$post_id = $wpdb->get_results("SELECT * FROM `image_main`");

$i=1;
$finimgarray = array();
$aa = array();
$bb = array();
$firstarray = array('similarity' =>100 , 'id' => $post_id[0]->id );

foreach($post_id as $key => $post){
    if($i < count($post_id)){
    $arraya =$post_id[0]->image_types;
    $a = explode(",",$arraya);
    $arrayb =$post_id[$i]->image_types;
    $b = explode(",",$arrayb);
    $array = array_unique (array_merge ($a, $b));
    $result=array_intersect($a,$b);
    $finalres = count($result) / count($array)*100 ;
    $finimgarray[] = array('similarity' =>round($finalres, 2) , 'id' => $post_id[$i]->id );
 }
    $i++;
}

array_push($finimgarray, $firstarray);
arsort($finimgarray);

foreach($finimgarray as $findimgarr){
  $id = $findimgarr['id'];
  $image = $wpdb->get_row("SELECT * FROM `image_main` WHERE `id` = $id ");
  echo "<img src='$image->image'/>";
}

您的输出会将图像与第一张图像进行比较,并根据相似度显示 %