聚类分析。寻找数据框中中心点与原点的欧氏距离的问题。

问题描述 投票:0回答:1

df_centroids中每行的7列显示的是7维空间的坐标。

import numpy as np 
import pandas as pd 
import scipy
df_centroids

        0           1           2           3           4            5          6
0   2.443664    -0.158806   -0.403137   0.609063    -0.412371   -0.486611   -0.687598
1   -0.389052   1.258986    -0.517471   -0.127748   0.379712    -0.486611   -0.143564
2   -0.215555   0.201088    1.149816    -0.501471   0.275600    -0.088475   1.434132
3   -0.227075   -0.806379   -0.412111   -0.174150   -0.417327   -0.401676   -0.234962
4   -0.130615   0.197548    1.282325    -0.940454   0.161774    2.167632    -0.263252
5   0.015202    -0.125552   -0.665733   1.792274    -0.360096   -0.390093   -0.044649

我试图计算从原点出发的欧氏距离,并将其保存在 "欧氏距离 "列中。请看下面的代码。

df_centroids['Euclidean Distance']=''
from scipy.spatial import distance

i=0
while i<len(df_centroids.index):
    centroid=[df_centroids.iloc[i,0], df_centroids.iloc[i,1], df_centroids.iloc[i,2], df_centroids.iloc[i,3], df_centroids.iloc[i,4], df_centroids.iloc[i,5], df_centroids.iloc[i,6]]
    df_centroids[i,7]=distance.euclidean([0, 0, 0, 0, 0, 0, 0], centroid)
    i+=1
df_centroids

       0            1          2          3             4           5           6      'Euclidean Distance'     (0, 7)      (1, 7)       (2, 7)       (3, 7)      (4, 7)     (5, 7)      (6, 7)      (7, 7)
0   2.443664    -0.158806   -0.403137   0.609063    -0.412371   -0.486611   -0.687598                       2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439
1   -0.389052   1.258986    -0.517471   -0.127748   0.379712    -0.486611   -0.143564                       2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439
2   -0.215555   0.201088    1.149816    -0.501471   0.275600    -0.088475   1.434132                        2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439
3   -0.227075   -0.806379   -0.412111   -0.174150   -0.417327   -0.401676   -0.234962                       2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439
4   -0.130615   0.197548    1.282325    -0.940454   0.161774    2.167632    -0.263252                       2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439
5   0.015202    -0.125552   -0.665733   1.792274    -0.360096   -0.390093   -0.044649                       2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439
6   0.256554    1.422368    1.139299    -0.917565   6.804388    -0.486611   0.726889                        2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439
7   6.010360    0.643581    2.401293    -1.193860   0.068166    1.636784    0.726889                        2.722099    1.556305    1.949607    1.136964    2.716432    1.988787    7.161965    6.851439

如你所见,这段代码没有计算欧氏空间,而是创建了8个新的列,并为所有行复制了同一组值。我到底错在哪里?

我试着在网上查找解决方法,但至今没有找到。真的很感谢任何帮助。

python numpy scipy cluster-analysis euclidean-distance
1个回答
2
投票

当使用 numpy你通常不需要使用循环。对于大多数的使用情况,存在高度调整的向量和矩阵操作。

对于你的问题,请注意,欧氏距离原点的距离与欧氏法线是一样的。有一个 作用于 numpy.linalg 为,。

要计算一个向量的欧氏(l-2)法线。

import np
np.linalg.norm([1, 2, 3])
# 3.7416573867739413

要计算一个矩阵的规范 行向量 每一行都要单独计算(就像你的问题一样)。

np.linalg.norm([[1,2,3],
                [4,5,6]], axis=1)
# array([3.74165739, 8.77496439])

要计算一个矩阵的规范 列向量 每一列都有单独的.iloc。

np.linalg.norm([[1, 4],
                [2, 5],
                [3, 6]], axis=0)
# array([3.74165739, 8.77496439])

2
投票

在你的代码中,你缺少了.iloc,应该是:

df.iloc[i, 7]

而不是:

df[i, 7]

为了避免这样的错误,我会使用apply:

sample = {'a': [2, 2, 3],'b': [3, 5, 2], 'c': [3, 6, 2]}
df = pd.DataFrame(sample)
origin = [0,0,0]
df['distance'] = df.apply(lambda x: distance.euclidean(origin, x), axis=1)
print(df)
>>>     a   b   c   distance
>>> 0   2   3   3   4.690416
>>> 1   2   5   6   8.062258
>>> 2   3   2   2   4.123106
© www.soinside.com 2019 - 2024. All rights reserved.