小编Sil*_*ger的帖子

欧几里德距离,Scipy,纯Python和Java之间的结果不同

我正在玩欧几里德距离度量的不同实现,我注意到我得到了Scipy,纯Python和Java的不同结果.

以下是我使用Scipy(=选项1)计算距离的方法:

distance = scipy.spatial.distance.euclidean(sample, training_vector)
Run Code Online (Sandbox Code Playgroud)

这是我在论坛中发现的Python实现(选项2):

distance = math.sqrt(sum([(a - b) ** 2 for a, b in zip(training_vector, sample)]))
Run Code Online (Sandbox Code Playgroud)

最后,这是我在Java中的实现(选项3):

public double distance(int[] a, int[] b) {
    assert a.length == b.length;
    double squaredDistance = 0.0;
    for(int i=0; i<a.length; i++){
        squaredDistance += Math.pow(a[i] - b[i], 2.0);
    }
    return Math.sqrt(squaredDistance);
}
Run Code Online (Sandbox Code Playgroud)

两个sampletraining_vector与长度784 1-d阵列,从所述数据集MNIST截取.我尝试了所有三种方法相同的sampletraining_vector.问题在于三种不同的方法导致三种显着不同的距离(即,选项1约为1936,选项2约为1914,选项3为1382).有趣的是,当我用同样的理由为了sampletraining_vector在选项1和2(即翻转参数选项1左右),我得到了这两个选项的结果相同.但距离指标应该是对称的,对吧......?

还有趣的是:我将这些指标用于MNIST数据集的k-NN分类器.对于100个测试样本和2700个训练样本,我的Java实现产生了大约94%的准确度.但是,使用选项1的Python实现仅产生约75%的准确度......

你有什么想法,为什么我得到这些不同的结果?如果您有兴趣,我可以在线发布两个阵列的CSV,并在此处发布链接.

我正在使用Java 8,Python 2.7和Scipy 1.0.0.

编辑: 将选项2更改为

distance = math.sqrt(sum([(float(a) - float(b)) ** 2 for …
Run Code Online (Sandbox Code Playgroud)

python java scipy knn euclidean-distance

7
推荐指数
1
解决办法
372
查看次数

标签 统计

euclidean-distance ×1

java ×1

knn ×1

python ×1

scipy ×1