scipy.spatial.distance.euclidean и scipy.spatial.- distance_matrix не возвращают тот же результат? - PullRequest
0 голосов
/ 23 января 2019

Я использовал технику агломерационной кластеризации для кластеризации набора данных транспортных средств.Я использовал два метода для вычисления матрицы расстояний, один из которых использовал scipy.spatial.distance.euclidean, а другой - scipy.spatial-distance_matrix.Поэтому, насколько я понимаю, я должен получить одинаковые результаты в обоих случаях.Который я думаю, что я получаю, но когда я сравниваю вывод обоих методов для некоторых элементов, я получаю false в качестве вывода.Может кто-нибудь объяснить мне, почему это происходит?

Шаги для воспроизведения:

!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)

рассчитать матрицу расстояний.

#M1 : Using scipy's euclidean

import scipy
leng = feature_mtx.shape[0]
D = scipy.zeros([leng,leng])
for i in range(leng):
    for j in range(leng):
        D[i,j] = scipy.spatial.distance.euclidean(feature_mtx[i], feature_mtx[j])
print(pd.DataFrame(D).head())

enter image description here

# M2 : using scipy.spatial's distance_matrix

from scipy.spatial import distance_matrix
dist_matrix = distance_matrix(feature_mtx,feature_mtx))
print(pd.DataFrame(dist_matrix).head())

enter image description here

Как вы можете видеть, несмотря на то, что оба результата при сравнении обеих матриц совпадают, я не могу получить истинное значение для каждого элемента

# Comparing

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

enter image description here

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 23 января 2019

На основании ответа Graipher вы можете попробовать это:

comp = np.isclose(dist_matrix, D)
pd.DataFrame(comp).head()

Теперь перейдем к вашему вопросу, почему это произошло.Это проблема, вызванная внутренним представлением чисел с плавающей запятой, которое использует фиксированное число двоичных цифр для представления десятичного числа.Некоторые десятичные числа не могут быть представлены точно в двоичном виде, что приводит к небольшим ошибкам округления.Люди часто очень удивляются таким результатам:

>>> 1.2-1.0
0.199999999999999996

Это не ошибка.Это проблема, вызванная внутренним представлением чисел с плавающей запятой, которое использует фиксированное число двоичных цифр для представления десятичного числа.Некоторые десятичные числа не могут быть представлены точно в двоичном виде, что приводит к небольшим ошибкам округления.

Числа с плавающей запятой имеют точность только 32 или 64 бита, поэтому цифры обрезаются в некоторой точке

...