Python scipy.spatial.distance.euclidean和scipy.spatial.-distance_矩阵返回的结果不同

Python scipy.spatial.distance.euclidean和scipy.spatial.-distance_矩阵返回的结果不同,python,scipy,hierarchical-clustering,euclidean-distance,distance-matrix,Python,Scipy,Hierarchical Clustering,Euclidean Distance,Distance Matrix,我使用凝聚聚类技术对车辆数据集进行聚类。我使用了两种方法来计算距离矩阵,一种是使用scipy.space.distance.euclidean,另一种是使用scipy.space-distance\u矩阵 所以根据我的理解,我应该在这两种情况下得到相同的结果。我想我得到了,但是当我比较两种方法的输出时,我得到了错误的输出。为什么会这样 复制步骤: !wget -O cars_clus.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf

我使用凝聚聚类技术对车辆数据集进行聚类。我使用了两种方法来计算距离矩阵,一种是使用scipy.space.distance.euclidean,另一种是使用scipy.space-distance\u矩阵

所以根据我的理解,我应该在这两种情况下得到相同的结果。我想我得到了,但是当我比较两种方法的输出时,我得到了错误的输出。为什么会这样

复制步骤:

!wget -O cars_clus.csv https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/ML0101ENv3/labs/cars_clus.csv
filename = 'cars_clus.csv'

#Read csv
pdf = pd.read_csv(filename)

# Clean the data
pdf[[ 'sales', 'resale', 'type', 'price', 'engine_s',
       'horsepow', 'wheelbas', 'width', 'length', 'curb_wgt', 'fuel_cap',
       'mpg', 'lnsales']] = pdf[['sales', 'resale', 'type', 'price', 'engine_s',
       'horsepow', 'wheelbas', 'width', 'length', 'curb_wgt', 'fuel_cap',
       'mpg', 'lnsales']].apply(pd.to_numeric, errors='coerce')
pdf = pdf.dropna()
pdf = pdf.reset_index(drop=True)

# selecting the feature set
featureset = pdf[['engine_s',  'horsepow', 'wheelbas', 'width', 'length', 'curb_wgt', 'fuel_cap', 'mpg']]

# Normalised using minmax
from sklearn.preprocessing import MinMaxScaler
x = featureset.values #returns a numpy array
min_max_scaler = MinMaxScaler()
feature_mtx = min_max_scaler.fit_transform(x)
计算距离矩阵。

正如你所看到的,即使当我比较两个矩阵时,两个结果都是相同的,但我无法得到每个元素的真值

# Comparing

pd.DataFrame(dist_matrix == D).head()

基于Graipher答案,您可以尝试以下方法:

comp = np.isclose(dist_matrix, D)
pd.DataFrame(comp).head()
现在来问你为什么会这样。 这是由浮点数的内部表示引起的问题,它使用固定数量的二进制数字来表示十进制数。有些十进制数不能用二进制精确表示,导致较小的舍入误差。 人们常常对这样的结果感到非常惊讶:

>>> 1.2-1.0
0.199999999999999996
这不是一个错误。这是由浮点数的内部表示引起的问题,它使用固定数量的二进制数字来表示十进制数。有些十进制数不能用二进制精确表示,导致较小的舍入误差


浮点数的精度只有32或64位,因此数字在某些点被截断

检查,这允许您忽略浮点数的不精确性。谢谢Graipher
comp = np.isclose(dist_matrix, D)
pd.DataFrame(comp).head()
>>> 1.2-1.0
0.199999999999999996