Scikit-learn: рдлреНрд▓реЛрдЯ 32 рдХреЗ рд╕рд╛рде рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди_рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 13 рдЬреБрд▓ре░ 2017  ┬╖  102рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: scikit-learn/scikit-learn

рд╡рд┐рд╡рд░рдг

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ sklearn.metrics.pairwise.pairwise_distances np.finalat64 рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп np.linalg.norm рд╕реЗ рд╕рд╣рдордд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди np.float32 рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрд╕рд╣рдордд рд╣реЛрддрд╛ рд╣реИред рдиреАрдЪреЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджреЗрдЦреЗрдВред

рдЪрд░рдг / рдХреЛрдб рдХреЛ рдкреБрди: рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛

import numpy as np
import scipy
import sklearn.metrics.pairwise

# create 64-bit vectors a and b that are very similar to each other
a_64 = np.array([61.221637725830078125, 71.60662841796875,    -65.7512664794921875],  dtype=np.float64)
b_64 = np.array([61.221637725830078125, 71.60894012451171875, -65.72847747802734375], dtype=np.float64)

# create 32-bit versions of a and b
a_32 = a_64.astype(np.float32)
b_32 = b_64.astype(np.float32)

# compute the distance from a to b using numpy, for both 64-bit and 32-bit
dist_64_np = np.array([np.linalg.norm(a_64 - b_64)], dtype=np.float64)
dist_32_np = np.array([np.linalg.norm(a_32 - b_32)], dtype=np.float32)

# compute the distance from a to b using sklearn, for both 64-bit and 32-bit
dist_64_sklearn = sklearn.metrics.pairwise.pairwise_distances([a_64], [b_64])
dist_32_sklearn = sklearn.metrics.pairwise.pairwise_distances([a_32], [b_32])

# note that the 64-bit sklearn results agree exactly with numpy, but the 32-bit results disagree
np.set_printoptions(precision=200)

print(dist_64_np)
print(dist_32_np)
print(dist_64_sklearn)
print(dist_32_sklearn)

рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ sklearn.metrics.pairwise.pairwise_distances рдХреЗ рдкрд░рд┐рдгрд╛рдо 64-рдмрд┐рдЯ рдФрд░ 32-рдмрд┐рдЯ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП np.linalg.norm рд╕реЗ рд╕рд╣рдордд рд╣реЛрдВрдЧреЗред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЙрдореНрдореАрдж рд╣реИ:

[ 0.0229059506440019884643266578905240749008953571319580078125]
[ 0.02290595136582851409912109375]
[[ 0.0229059506440019884643266578905240749008953571319580078125]]
[[ 0.02290595136582851409912109375]]

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

[ 0.0229059506440019884643266578905240749008953571319580078125]
[ 0.02290595136582851409912109375]
[[ 0.0229059506440019884643266578905240749008953571319580078125]]
[[ 0.03125]]

рд╕рдВрд╕реНрдХрд░рдгреЛрдВ

Darwin-16.6.0-x86_64-i386-64bit
('Python', '2.7.11 | 64-bit | (default, Jun 11 2016, 03:41:56) \n[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]')
('NumPy', '1.11.3')
('SciPy', '0.19.0')
('Scikit-Learn', '0.18.1')
Blocker Bug help wanted

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ, рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдПрдХ рдорд╛рдк рд╕реЗ рдЖрддрд╛ рд╣реИ, рдФрд░ 9 рд╡реЗрдВ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдЯреАрдХ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реИ (рдХрдг рднреМрддрд┐рдХреА рдореЗрдВ рдмрд╣реБрдд рдХрдо рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рд╕реЗ рдХрдЪреНрдЪреЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдЯреАрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣ рд╕рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдПрдордПрд▓ рдЙрд╕ рддрд░рд╣ рдХреЗ рдЗрдирдкреБрдЯ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЧрдгрд┐рддреАрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП ML рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдорд╛рдгрд┐рдХ рдХреА рдХреНрдпреВрдм рдЬреИрд╕реА рдкрд╣реЗрд▓реА рдХреЗ рдЧреНрд░рд╛рдл рдкрд░ MDS рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдпрд╛ рдкреИрдбрдореИрди рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓реЗ RL рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдЭреБрдВрдб рджреНрд╡рд╛рд░рд╛ рдкрд╛рдИ рдЧрдИ рд╕рдлрд▓ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХрд░рдирд╛ред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╕реВрдЪрдирд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрд░реЛрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдордзреНрдп-рдорд╛рд░реНрдЧ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдВрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдкрд░ рдПрдХ рдврд╛рд▓ рд╡рдВрд╢ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рддрд░рд╣ рдЬрд┐рд╕рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдирдореВрдирд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЕрднреА рднреА рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╕реНрдХреЛрд░-рд▓рд░реНрди рдХреЛ рдЯреНрд░реЗрдб-рдСрдл рд╕рдЯреАрдХрддрд╛ рдмрдирд╛рдо рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рд╕рдордп рдореЗрдВ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЬреЛ рдХреЛрдИ рднреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИ рдЙрд╕реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 102 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдЬрдЧрд░ 3.5 рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо:

Darwin-15.6.0-x86_64-i386-64bit
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
NumPy 1.11.0
SciPy 0.18.1
Scikit-Learn 0.17.1

рдпрд╣ рдХреЗрд╡рд▓ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реАрдзреЗ sklearn.metrics.pairwise.euclidean_distances рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

import scipy
import sklearn.metrics.pairwise

# create 64-bit vectors a and b that are very similar to each other
a_64 = np.array([61.221637725830078125, 71.60662841796875,    -65.7512664794921875],  dtype=np.float64)
b_64 = np.array([61.221637725830078125, 71.60894012451171875, -65.72847747802734375], dtype=np.float64)

# create 32-bit versions of a and b
a_32 = a_64.astype(np.float32)
b_32 = b_64.astype(np.float32)

# compute the distance from a to b using sklearn, for both 64-bit and 32-bit
dist_64_sklearn = sklearn.metrics.pairwise.euclidean_distances([a_64], [b_64])
dist_32_sklearn = sklearn.metrics.pairwise.euclidean_distances([a_32], [b_32])

np.set_printoptions(precision=200)

print(dist_64_sklearn)
print(dist_32_sklearn)

рдореИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

numpy рдПрдХ рдЙрдЪреНрдЪ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рд╕рдВрдЪрд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рдВ, рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ
рдлрд┐рдХреНрд╕рд┐рдВрдЧ рдХреЗ рд╣рдХрджрд╛рд░ рд╣реИрдВред

19 рдЬреБрд▓рд╛рдИ 2017 рдХреЛ 12:05 рдмрдЬреЗ, "nvauquie" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЕрдЬрдЧрд░ 3.5 рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо:

рдбрд╛рд░реНрд╡рд┐рди-15.6.0-x86_64-i386-64bit
рдкрд╛рдпрдерди 3.5.1 (v3.5.1: 37a07cee5969, 5 рджрд┐рд╕рдВрдмрд░ 2015, 21:12:44)
[рдЬреАрд╕реАрд╕реА рек.реи.рез (Apple Inc. рдмрд┐рд▓реНрдб релремремремрем) (рдбреЙрдЯ рей)]
NumPy 1.11.0
рд╡рд┐рдЬреНрдЮрд╛рдирдкреА реж.рез 0..рез
рд╕реНрдХрд┐рдЯрд┐рдЯ-рд▓рд░реНрди 0.17.1

рдпрд╣ рдХреЗрд╡рд▓ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреБрди: рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд╕реАрдзреЗ sklearn.metrics.pairwise.euclidean_distances:

рдЖрдпрд╛рдд рд╕реЗ рдбрд░ рд▓рдЧрддрд╛ рд╣реИ
рдЖрдпрд╛рдд sklearn.metrics.pairwise

64-рдмрд┐рдЯ рд╡реИрдХреНрдЯрд░ a рдФрд░ b рдмрдирд╛рдПрдВ рдЬреЛ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдорд╛рди рд╣реЛрдВ

a_64 = np.array ([61.221637725830078125, 71.60662841796875, -65.7512664794921875], dtype = np.flobad64
b_64 = np.array ([61.221637725830078125, 71.60894012451171875, -65.72847747802734375], dtype = np .float64)

a рдФрд░ b рдХреЗ 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдПрдБ

a_32 = a_64.astype (np.float32)
b_32 = b_64.astype (np.float32)

64-рдмрд┐рдЯ рдФрд░ 32-рдмрд┐рдЯ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕реНрдХреЗрд▓реЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреА рд╕реЗ рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ

dist_64_sklearn = sklearn.metrics.pairwise.euclidean_distances ([a_64], [b_64])
dist_32_sklearn = sklearn.metrics.pairwise.euclidean_distances ([a_32], [b_32])

np.set_printoptions (рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ = 200)

рдкреНрд░рд┐рдВрдЯ (dist_64_sklearn)
рдкреНрд░рд┐рдВрдЯ (dist_32_sklearn)

рдореИрдВ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреА рд╕рджрд╕реНрдпрддрд╛ рджреА рдЧрдИ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/scikit-learn/scikit-learn/issues/9354#issuecomment-316074315 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAEz65yy8Aq2FcsDAcWHT8qkkdXF_MfPks5sPLu_gaJpZM4OXbpZ
ред

рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдореИрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛

рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВ!

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИ рдХрд┐ рд╣рдо рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y)) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ - (-2 * np.dot(X, Y.T) + (X * X).sum(axis=1) + (Y * Y).sum(axis=1) рдореБрдЭреЗ np.float32 рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореБрдЭреЗ np.float 64 рдХреЗ рд▓рд┐рдП рд╕рд╣реА ans рдорд┐рд▓рддрд╛ рд╣реИред

@jnothman рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рддрдм рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдЬреИрд╕рд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдКрдкрд░ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y)) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ

рддреЛ рдЖрдк рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдбреЙрдЯ рдЙрддреНрдкрд╛рдж-рддрддреНрдХрд╛рд▓реАрди рд░рд╛рд╢рд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рджреЗ рд░рд╣рд╛ рд╣реИ?

рдирд╣реАрдВ, рдЬреЛ рдореИрдВ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдЙрддреНрдкрд╛рдж-рддрдм-рдпреЛрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рджреЗ рд░рд╣рд╛ рд╣реИ
-2 * np.dot(X, Y.T) + (X * X).sum(axis=1) + (Y * Y).sum(axis=1) рдЖрдЙрдЯрдкреБрдЯ [[0.]]
рдЬрдмрдХрд┐ np.sqrt(((X-Y) * (X-Y)).sum(axis=1)) рдЖрдЙрдЯрдкреБрдЯ [ 0.02290595]

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреИрдВрдб-рдЕрд▓реЛрди рд╕реНрдирд┐рдкреЗрдЯ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЖрдкрдХреА рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдЬрд┐рди рджреЛ рдЪреАрдЬреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ [[0.]] рдФрд░ [0.022...] рд╕рдорд╛рди рдЖрдпрд╛рдо рдирд╣реАрдВ рд╣реИрдВ (рд╢рд╛рдпрдж рдПрдХ рдХреЙрдкреА рдФрд░ рдкреЗрд╕реНрдЯ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рдЬрд╛рдирдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдПрдХ рдкреВрд░реНрдг рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ)ред

рдУрдХреЗ рд╕реЙрд░реА рдореЗрд░реА рдмреБрд░

import numpy as np
import scipy
from sklearn.metrics.pairwise import check_pairwise_arrays, row_norms
from sklearn.utils.extmath import safe_sparse_dot

# create 64-bit vectors a and b that are very similar to each other
a_64 = np.array([61.221637725830078125, 71.60662841796875,    -65.7512664794921875],  dtype=np.float64)
b_64 = np.array([61.221637725830078125, 71.60894012451171875, -65.72847747802734375], dtype=np.float64)

# create 32-bit versions of a and b
X = a_64.astype(np.float32)
Y = b_64.astype(np.float32)

X, Y = check_pairwise_arrays(X, Y)
XX = row_norms(X, squared=True)[:, np.newaxis]
YY = row_norms(Y, squared=True)[np.newaxis, :]

#Euclidean distance computed using product-then-sum
distances = safe_sparse_dot(X, Y.T, dense_output=True)
distances *= -2
distances += XX
distances += YY
print(np.sqrt(distances))

#Euclidean distance computed using (X-Y)^2
print(np.sqrt(row_norms(X-Y, squared=True)[:, np.newaxis]))

рдЖрдЙрдЯрдкреБрдЯ

[[ 0.03125]]
[[ 0.02290595136582851409912109375]]

рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдХреИрд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореЗрд░реЗ рдХрд╣рдиреЗ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдерд╛ рдХрд┐ рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЬрдм рд╣рдо рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рдпреЛрдЧ рд╕рдЯреАрдХ рд╣реЛрддрд╛ рд╣реИ

рд╣рд╛рдВ, рдореИрдВ рдЗрд╕реЗ рджреЛрд╣рд░рд╛ рд╕рдХрддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдШрдЯрд╛рд╡ рдХрд░ рд░рд╣реА рд╣реИ
рдЕрдВрддрд░ рдХреА рд╢реБрджреНрдзрддрд╛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмрд┐рдВрджреА рд▓рдЧрд╛рдирд╛
рдЙрддреНрдкрд╛рдж рдФрд░ рдлрд┐рд░ рдШрдЯрд╛рдирд╛ (рдпрд╛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЬреЛрдбрд╝рдирд╛), рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ,
рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрдВрдХрдбрд╝реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕ рд╕рдЯреАрдХрддрд╛ рдХреЛ рдЦреЛ рджреЗрддрд╛ рд╣реИ
рдЕрдВрддрд░ред

рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реНрдореГрддрд┐ рдХреБрд╢рд▓ рд╣реИ
рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рддреЗрдЬреА рд╕реЗ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЬрд╛рддреА рд╣реИ
рдЙрдЪреНрдЪ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ, рдЗрд╕рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрдЙрдЯрдкреБрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╣рд╛рд╡реА рд╣реИ
рдорд╛рдиред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЕрдкрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорддрджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ
d-asymptotically рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИред рдПрдХ рд╕реБрдЭрд╛рд╡,
@ogrisel? @agramfort?

рдФрд░ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдлреНрд▓реЛрдЯ 32s рдХреА рдЕрдиреБрдорддрд┐ рджреА рдереА
рдЕрдиреБрдорд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдирд╛ред

рддреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рдж-рддрдм-рдпреЛрдЧ np.float64 рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрдирдкреБрдЯ рдХреЛ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдлреНрд▓реЛрдЯ 32 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рджреЗрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

float64 рдореЗрдВ рдХрдирд╡рд░реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛
рдШрдЯрд╛рд╡ред

рдУрд╣, рд╣рд╛рдБ, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╣реА рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдлреНрд▓реЛрдЯ64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЙрддреНрдкрд╛рдж рдХрд░рдирд╛-рддрдм-рдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореЗрдореЛрд░реА рдмреБрджреНрдзрд┐рдорд╛рди рдирд╣реАрдВ рд╣реИред

рдФрд░ рдЙрддреНрдкрд╛рдж-рддрдм-рдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдЕрдзрд┐рдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рджрдХреНрд╖рддрд╛ рдФрд░ рд╕реНрдореГрддрд┐ рджрдХреНрд╖рддрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдерд╛ред

рдпрдХреАрди рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдирдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ
рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдзрд┐рдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рдХреБрд╢рд▓
рдордзреНрдпрд╡рд░реНрддреА рд╕рд░рдгреАред рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╕реНрдореГрддрд┐ (рдЬреИрд╕реЗ) рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдЪреВрдирд┐рдВрдЧ), рдбреЙрдЯ рдЙрддреНрдкрд╛рдж рдХреЛ рдХреНрдпреЛрдВ рд▓реЗрдирд╛, рдорд╛рдирджрдВрдбреЛрдВ рдХреЛ рджреЛрдЧреБрдирд╛ рдФрд░ рдШрдЯрд╛рдирд╛ рд╣реЛрдЧрд╛
рдШрдЯрд╛рдирд╛ рдФрд░ рд╡рд░реНрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ?

рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ?

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдШрдЯрд╛рд╡-рддрдм-рд╕реНрдХреНрд╡рд░рд┐рдВрдЧ рдФрд░ рдлрд╝реНрд▓реЛрдЯ64 рдХреЗ рд▓рд┐рдП рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдлрд┐рд░ рдЙрддреНрдкрд╛рдж-рддрдм-рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдП рдЧрдП рд╕рдордп рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдХреЛ рдмрд╣реБрдд рдмрдбрд╝реЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирддреЗ рд╣реИрдВ рддреЛ 2 рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ @jnothman рдЖрдк рд╕рд╣реА рдШрдЯрд╛рд╡-рддрдм-
рдпрд╣рд╛рдВ рд╡рд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рд▓рд┐рдЦреА рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ

import numpy as np
import scipy
from sklearn.metrics.pairwise import check_pairwise_arrays, row_norms
from sklearn.utils.extmath import safe_sparse_dot
from timeit import default_timer as timer

for i in range(9):
    X = np.random.rand(1,3 * (10**i)).astype(np.float32)
    Y = np.random.rand(1,3 * (10**i)).astype(np.float32)

    X, Y = check_pairwise_arrays(X, Y)
    XX = row_norms(X, squared=True)[:, np.newaxis]
    YY = row_norms(Y, squared=True)[np.newaxis, :]

    #Euclidean distance computed using product-then-sum
    distances = safe_sparse_dot(X, Y.T, dense_output=True)
    distances *= -2
    distances += XX
    distances += YY

    ans1 = np.sqrt(distances)

    start = timer()
    ans2 = np.sqrt(row_norms(X-Y, squared=True)[:, np.newaxis])
    end = timer()
    if ans1 != ans2:
        print(end-start)

        start = timer()
        X = X.astype(np.float64)
        Y = Y.astype(np.float64)
        X, Y = check_pairwise_arrays(X, Y)
        XX = row_norms(X, squared=True)[:, np.newaxis]
        YY = row_norms(Y, squared=True)[np.newaxis, :]
        distances = safe_sparse_dot(X, Y.T, dense_output=True)
        distances *= -2
        distances += XX
        distances += YY
        distances = np.sqrt(distances)
        end = timer()
        print(end-start)
        print('')
        if abs(ans2 - distances) > 1e-3:
            # np.set_printoptions(precision=200)
            print(ans2)
            print(np.sqrt(distances))

            print(X, Y)
            break

рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдХрд┐ рдпрд╣ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдорд╛рдкрддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓
рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ ... рдорд╛рдирджрдВрдб рд▓реЗрдиреЗ рд╕реЗ рдХреБрдЫ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд╛рдн рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рдирдореВрдиреЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмрд╛рд░, рдирдореВрдиреЗ рдХреА рдЬреЛрдбрд╝реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдмрд╛рд░ рдирд╣реАрдВ

20 рдЕрдХреНрдЯреВрдмрд░ 2017 рдХреЛ 2:39 рдмрдЬреЗ, "рдУрд╢реИрдж рд░рд╣рдорд╛рди рдирд╛рд╕рд┐рд░" рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдареАрдХ рд╣реИ рддреЛ рдореИрдВрдиреЗ рд╕рдордп рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЬрдЧрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ
рдШрдЯрд╛рд╡-рддрдм-рд╡рд░реНрдЧ рдФрд░ рдлрд╝реНрд▓реЛрдЯ64 рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рддрдм рдЙрддреНрдкрд╛рдж-рддрдм-рдпреЛрдЧ
рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрджрд┐ рд╣рдо рдПрдХ X рдФрд░ Y рдХреЛ рдмрд╣реБрдд рдмрдбрд╝реЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирддреЗ рд╣реИрдВ рддреЛ 2
рдкрд░рд┐рдгрд╛рдо рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ @jnothman https://github.com/jnothman
рдЖрдк рд╕рд╣реА рдШрдЯрд╛рд╡ рдереЗ-рддрдм-рд╕реНрдХреНрд╡реИрд░рд┐рдВрдЧ рддреЗрдЬ рд╣реИред
рдпрд╣рд╛рдВ рд╡рд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рд▓рд┐рдЦреА рд╣реИ, рдЕрдЧрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ

рдЖрдпрд╛рдд рдПрдирдкреАрдкреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдиреНрди
рдЖрдпрд╛рдд рд╕реЗ рдбрд░ рд▓рдЧрддрд╛ рд╣реИ
sklearn.metrics.pairwise рдЖрдпрд╛рдд рд╕реЗ check_pairwise_arrays, row_norms
sklearn.utils.extmath рд╕реЗ safe_sparse_dot рдЖрдпрд╛рдд рдХрд░реЗрдВ
рдЯрд╛рдЗрдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдЖрдпрд╛рдд default_timer

рдореИрдВ рд╕реАрдорд╛ рдореЗрдВ (9):
X = np.random.rand (1,3 * (10 i))ред astype (np.float32)Y = np.random.rand (1,3 * (10 i))ред astype (np.float32)

X, Y = check_pairwise_arrays (X, Y)
XX = row_norms (X, рдЪреБрдХрддрд╛ = рд╕рддреНрдп) [:, np.newaxis]
YY = row_norms (Y, рдЪреБрдХрддрд╛ = рд╕рддреНрдп) [np.newaxis,:]

# рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдЙрддреНрдкрд╛рдж-рддрдм-рдпреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЧрдгрдирд╛ рдХреА
рджреВрд░реА = safe_sparse_dot (X, YT, dense_output = True)
рджреВрд░реА * = -2
рджреВрд░реА + = XX
рджреВрд░рд┐рдпрд╛рдБ = = YY

ans1 = np.sqrt (рджреВрд░рд┐рдпрд╛рдВ)

рд╕реНрдЯрд╛рд░реНрдЯ = рдЯрд╛рдЗрдорд░ ()
ans2 = np.sqrt (row_norms (XY, рдЪреБрдХрддрд╛ = рд╕рддреНрдп) [:, np.newaxis])
рдЕрдВрдд = рдЯрд╛рдЗрдорд░ ()
рдЕрдЧрд░ ans1! = ans2:
рдкреНрд░рд┐рдВрдЯ (рдЕрдВрдд рд╕реЗ рд╢реБрд░реВ)

  start = timer()
  X = X.astype(np.float64)
  Y = Y.astype(np.float64)
  X, Y = check_pairwise_arrays(X, Y)
  XX = row_norms(X, squared=True)[:, np.newaxis]
  YY = row_norms(Y, squared=True)[np.newaxis, :]
  distances = safe_sparse_dot(X, Y.T, dense_output=True)
  distances *= -2
  distances += XX
  distances += YY
  distances = np.sqrt(distances)
  end = timer()
  print(end-start)
  print('')
  if abs(ans2 - distances) > 1e-3:
      # np.set_printoptions(precision=200)
      print(ans2)
      print(np.sqrt(distances))

      print(X, Y)
      break

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/scikit-learn/scikit-learn/issues/9354#issuecomment-337948154 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAEz6z5o2Ao_7V5-Lflb4HosMrHCeOrVks5st209gaJpZM4OXbpZ
ред

рд╡реИрд╕реЗ рднреА, рдХреНрдпрд╛ рдЖрдк PR, @ragnerok рд╕рдмрдорд┐рдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?

рд╣рд╛рдБ, рдпрдХреАрди рд╣реИ, рддреБрдо рдореБрдЭреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реЛ?

рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░реЗрдВ, рдпрд╣ рднреА рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдХрд┐ рдХреЗ рддрд╣рдд рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛
рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдирд╣реАрдВ рдЦреЛрддреЗ рд╣реИрдВ
рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдмрд╣реБрдд, рдЙрдЪрд┐рдд рдорд╛рдорд▓реЛрдВ рдореЗрдВред

рдореИрдВ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдХреЗ рдмреАрдЪ рджреВрд░реА рддрдп рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рдирд╣реАрдВ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЖрдк рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ (рджреВрд░реА рдирд╣реАрдВ) рдХрд╛ рдорддрд▓рдм рд╣реИ? рдпрджрд┐ рдЖрдк рд╕реБрдиреНрди рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдХреГрддрд┐рдпреЛрдВ (n_samples1, n_features) рдФрд░ (n_samples2, n_features) рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ (n_samples1, 1, n_features) рдФрд░ (1, n_samples2, n_features) рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

>>> X = np.random.randint(10, size=(10, 5))
>>> Y = np.random.randint(10, size=(11, 5))
X.reshape(-1, 1, X.shape[1]) - Y.reshape(1, -1, X.shape[1])

рд╣рд╛рдБ рдзрдиреНрдпрд╡рд╛рдж рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХреА ЁЯШД

рдореИрдВ рдпрд╣ рднреА рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реВрдВ рдореИрдВ X_norm_squared рдФрд░ Y_norm_squared рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рддреЛ рдХреНрдпрд╛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рддрд░реНрдХреЛрдВ рд╕реЗ рднреА рд╣рдЯрд╛ рджреВрдВ рдпрд╛ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХрд╛рдо рдХрд╛ рдирд╣реАрдВ рд╣реИ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдкрджрд╛рд╡рдирдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдпрд╣ рдЖрд╢реНрд╡рд╛рд╕рди рджреЗрдирд╛ рд╣реЛрдЧрд╛
рдРрд╕рд╛ рдХреЛрдИ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдореЗрдВ рдХрд╛рдлреА рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рд╣реИ
рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рд╕реА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреЛ рдзреАрдорд╛ рди рдХрд░реЗрдВ
рдорд╛рдорд▓реЛрдВред рд╣рдо рдЙрдЪреНрдЪ рд╕реНрдореГрддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЦрдВрдбреВ рдореЗрдВ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ
рдЙрдкрдпреЛрдЧ (рдЬреЛ рд╢рд╛рдпрдж рдЗрд╕ рддрдереНрдп рд╕реЗ рдкреЗрдЪреАрджрд╛ рдмрдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рднреАрддрд░ рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдореЛрд░реА рд╕реЗ рд╕реЗрд╡рд╛рдирд┐рд╡реГрддреНрддрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдмрд╛рдбрд╝ рдХрд░рддреЗ рд╣реИрдВ
рдЬреЛрдбрд╝реАрджрд╛рд░ рджреВрд░реА)ред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдиреНрдп рдХреЛрд░ рджреЗрд╡реЛрдВ рд╕реЗ рд╕реБрдирдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ
рд▓рд╛рдЧрдд рдФрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ ... @ogrisel , @lesteve , @rth ...

5 рдирд╡рдВрдмрд░ 2017 рдХреЛ 5:27 рдмрдЬреЗ, "рдУрд╢реИрдж рд░рд╣рдорд╛рди рдирд╛рд╕рд┐рд░" рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореИрдВ рдпрд╣ рднреА рдкреВрдЫрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдПрдХ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░реВрдБрдЧрд╛ рдЬреЛ рдореИрдВ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛
X_norm_squared рдФрд░ Y_norm_squared рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рддреЛ рдХреНрдпрд╛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛ рджреВрдВ
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╛ рдореИрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐рд╕реА рднреА рдХрд╛рдо рдХрд╛ рдирд╣реАрдВ рд╣реИ?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/scikit-learn/scikit-learn/issues/9354#issuecomment-341919282 ,
рдпрд╛ рдзрд╛рдЧрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAEz63izdpQGDEuW32m8Aob6rrsvV6q-ks5szKyHgaJpZM4OXbpZ
ред

рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдкреАрдЖрд░ рдЦреЛрд▓рддреЗ рд╣реИрдВ рддреЛ рдареАрдХ-рдареАрдХ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛

рдареАрдХ рд╣реИ, рдореИрдВ рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдПрдХ рдкреАрдЖрд░ рддреЛ рдЦреЛрд▓реВрдВрдЧрд╛

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ 0.20 рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдХреБрдЫ рд╕рд░рд▓ / рдЕрд╕реНрдерд╛рдпреА рд╕реБрдзрд╛рд░ (рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ рдХреА рд▓рд╛рдЧрдд рдкрд░ рдШрдЯрдирд╛) рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

# 11271 рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмрд╣реБрдд рдореВрд▓реНрдпрд╡рд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╖реНрдЯрддрдо рд╕рдорд╛рдзрд╛рди рд╣реИ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЪрд┐рдВрддрд┐рдд рд╣реВрдВ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ CPU рдкреНрд░рдХрд╛рд░ рдЖрджрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ https://github.com/scikit-learn/scikit-learn/issues/11506 рдореЗрдВ рдЗрд╖реНрдЯрддрдо рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рдордХрд╛рдЬреА рд╕реНрдореГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд▓рдВрдмрд┐рдд рдЪрд░реНрдЪрд╛ рд╣реИред рдЕрднреА рддрдХ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рдордВрдерди рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдВрдкреВрд░реНрдг рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдЖрдИрдПрдордУ рдХреЛ рдереЛрдбрд╝рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧреАред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдореБрдЭреЗ рд╣реИ, рдПрдХ рджреВрд╕рд░реА рд░рд╛рдп рдХреА рддрд▓рд╛рд╢ рдореЗрдВред

рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП @jnothman @amueller @ogrisel ?

рд╕реНрдерд┐рд░рддрд╛ рдЯреНрд░рдореНрдк рджрдХреНрд╖рддрд╛ред рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рднреА рдЬрдм рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рджрдХреНрд╖рддрд╛ рдЕрднреА рднреА tweaks рдХреА рдЬрд░реВрд░рдд рд╣реИред

working_memory рдХрд╛ рдзреНрдпрд╛рди рдмрдбрд╝реЗ рдирдореВрдиреЗ рдХреЗ рд╕рд╛рде рд╕рд┐рд▓реНрд╣реВрдЯ рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛
рдЖрдХрд╛рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рднреА рджрдХреНрд╖рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдиреАрдЪреЗ tweaked рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рд▓рд╛рдЗрдиред

рдореЗрд░рд╛ рджреГрдврд╝рддрд╛ рд╕реЗ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди_рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд┐рдХреНрд╕ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
рдлреНрд▓реЛрдЯ 32 рдЗрдиред рд╣рдордиреЗ рдпрд╣ рдорд╛рдирдХрд░ 0.19 рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдХрд┐ рд╣рдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ
euclidean_distances 32 рдмрд┐рдЯ рдкрд░ рдПрдХ рднреЛрд▓реЗ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕реБрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореЗрд░реА рдЪрд┐рдВрддрд╛ рджрдХреНрд╖рддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдЖрдзрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓рддрд╛ рд╣реИред

рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд▓реЗрддреЗ рд╣реБрдП, рд╕реНрдХреИрдкреА рдХреЗ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реА рдХреЛрдб рдХреА 10 рд▓рд╛рдЗрдиреЗрдВ рд▓рдЧрддреА рд╣реИрдВ рдФрд░ 32 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЙрдиреНрд╣реЗрдВ 64 рдмрд┐рдЯ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рдФрд░ рд╕рдордЭрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред рд╕реНрдХрд┐рдХрд┐рдЯ-рд▓рд░реНрди рдореЗрдВ, рд╣рдо BLAS рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ https://github.com/scikit-learn/scikit-learn/pull/10212 рдФрд░ рдЕрдм рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрдзрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВред 32 рдмрд┐рдЯ рдореЗрдВ рджреВрд░реАред

рдореИрдВ рд╕рд┐рд░реНрдл рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рджрд┐рд╢рд╛ рдХреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ (рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рдХреБрдЫ рдХреЛ рдКрдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдХреИрдкреА рдЖрджрд┐ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ)ред

рдбреЗрдЯрд╛ рдХреЙрдкреА рдХрд░рдХреЗ рдЪрд┐рдВрддрд┐рдд рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ ...

рдкреАрдЖрд░ рдХреЗ рдмрд╛рдж 0.21 рдкрд░ рдЬрд╛рдПрдВред

рдЕрд╡рд░реЛрдзрдХ рдирд┐рдХрд╛рд▓реЗрдВ?

sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y))

рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЕрд╕реНрдерд┐рд░ рд╣реИ, рдпрджрд┐ рдбреЙрдЯ (x, x) рдФрд░ рдбреЙрдЯ (y, y) рд╕рдорд╛рди рдкрд░рд┐рдорд╛рдг рдХреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдбреЙрдЯ (x, y) рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рднрдпрд╛рд╡рд╣ рд░рджреНрдж рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛

рдпрд╣ рди рдХреЗрд╡рд▓ FP32 рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдореБрдЦ рд╣реИ, рдФрд░ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣рд╛рдВ рдПрдХ рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреЛрд╣рд░реА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде рдХрд┐рддрдирд╛ рдмреБрд░рд╛ рд╣реИ:

import numpy
from sklearn.metrics.pairwise import euclidean_distances

a = numpy.array([[100000001, 100000000]])
b = numpy.array([[100000000, 100000001]])

print "skelarn:", euclidean_distances(a, b)[0,0]
print "correct:", numpy.sqrt(numpy.sum((a-b)**2))

a = numpy.array([[10001, 10000]], numpy.float32)
b = numpy.array([[10000, 10001]], numpy.float32)

print "skelarn:", euclidean_distances(a, b)[0,0]
print "correct:", numpy.sqrt(numpy.sum((a-b)**2))

рд╕реНрдХреЗрд▓реЗрд░рди sqrt (2) рдХреЗ рдмрдЬрд╛рдп рджреЛрдиреЛрдВ рдмрд╛рд░ 0 рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдЪрд░рдг рдФрд░ рд╕рд╣рд╕рдВрдпреЛрдЬрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдореБрджреНрджреЛрдВ рдХреА рдПрдХ рдЪрд░реНрдЪрд╛ - рдФрд░ рдпрд╣ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдПрд░рд┐рдХ рд╢реБрдмрд░реНрдЯ, рдФрд░ рдорд╛рдЗрдХрд▓ рдЧрд░реНрдЯреНрдЬрд╝ред
рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рд░ рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрдЧрдгрдирд╛ (рд╕рд╣) рднрд┐рдиреНрдиред
рдореЗрдВ: рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдФрд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рдмрдВрдзрди (SSDBM), рдмреЛрд▓рдЬрд╛рдиреЛ-рдмреЛрдЬрди, рдЗрдЯрд▓реА рдкрд░ 30 рд╡реЗрдВ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдп рд╕рдореНрдореЗрд▓рди рдХреА рдХрд╛рд░реНрдпрд╡рд╛рд╣реАред 2018, 10: 1-10: 12

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ y рд╕рдордиреНрд╡рдп рдХреЛ рдЙрд╕ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╣реА рджреВрд░реА рддрдм рддреБрдЪреНрдЫ рд╣реЛ рдЬрд╛рддреА рд╣реИред 1. рдореИрдВрдиреЗ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ:

    XA = np.array([[10000]], np.float32)
    XB = np.array([[10001]], np.float32)
    assert_equal(euclidean_distances(XA, XB)[0,0], 1)

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдореЗрд░рд╛ рдкреЗрдкрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдмрд╕ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдХреА рдЧрдгрдирд╛ sqrt (рдпреЛрдЧ (рдкрд╛рд╡рд░))) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВ рдФрд░ рдпрд╣ рдПрдХрд▓-рдкрд╛рд╕ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЙрдЪрд┐рдд рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рд╣реИред рдиреБрдХрд╕рд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА, рдпрд╛рдиреА, рдбреЙрдЯ (рдПрдХреНрд╕, рдПрдХреНрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдЦреЛ рд░рд╣рд╛ рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ @amueller рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЕрд╡рд░реЛрдзрдХ рд▓реЗрдмрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ ...

рдЗрд╕ рдмрд╣реБрдд рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рддреЗрдЬреА рд╕реЗ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдирд┐рдЪреЗ рджреЗрдЦреЛ:

x = np.random.random_sample((1000, 1000))

%timeit euclidean_distances(x,x)
20.6 ms ┬▒ 452 ┬╡s per loop (mean ┬▒ std. dev. of 7 runs, 10 loops each)

%timeit cdist(x,x)
695 ms ┬▒ 4.06 ms per loop (mean ┬▒ std. dev. of 7 runs, 1 loop each)

рдпрджреНрдпрдкрд┐ рдСрдкрд░реЗрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдХреНрд░рдо рдХреА рд╣реИ (рджреВрд╕рд░реЗ рдореЗрдВ 1.5x рдЕрдзрд┐рдХ), рд╕реНрдкреАрдбрдЕрдк рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдмреАрдПрд▓рдПрдПрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕реЗ рдЖрддрд╛ рд╣реИред

рдпрд╣ рд╕реНрдХреЛрд░-рд▓рд░реНрди рдореЗрдВ рдХрдИ рдЕрдиреБрдорд╛рдирдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реА рдордВрджреА рд╣реЛрдЧреАред

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдПрдлрдкреА 32 рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд┐рд░реНрдл 3-4 рдЕрдВрдХ , рдФрд░ рдПрдлрдкреА 64 рдХреЗ рд╕рд╛рде 7-8 рдЕрдВрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╡реГрджреНрдзрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рд╣реИ рдирд╛? рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЪреВрдВрдХрд┐ рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдмрдврд╝ рдЬрд╛рддреА рд╣реИрдВ ...

рд╡реИрд╕реЗ рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдЕрднреА рдареАрдХ рд╣реИред :)
рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдмреАрдЪ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдПрдХ рдкреАрдЖрд░ (# 11271) рд╣реИ рдЬреЛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓реЛрдЯ64 рдкрд░ рдбрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИред рдлреНрд▓реЛрдЯ64 рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлреНрд▓реЛрдЯ 32 рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рджреЗрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдЕрдиреБрдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬреЛ рдХрд┐ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди_рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдХрд╛рд░рдг рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ?

рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝реА рдмрд╛рдд рд╣реИ рдФрд░ 0.21 рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрдзрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ 0.19 рдореЗрдВ 32 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдореБрджреНрджрд╛ рдерд╛, рдФрд░ рдЗрд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИред рдХрд╛рд╢ рд╣рдордиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ 0.20 рдореЗрдВ рд╣рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реЛрддрд╛, рдФрд░ рдореИрдВ рдареАрдХ рд╣реЛрддрд╛, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрддреНрд╕реБрдХ рд╣реЛрддрд╛, # 11271 рдЕрдВрддрд░рд┐рдо рдореЗрдВ рд╡рд┐рд▓реАрди рд╣реЛрддрд╛ред рдЙрд╕ рдкреАрдЖрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд╣реИ рдХрд┐ рдореИрдВ рд╕реНрдореГрддрд┐ рджрдХреНрд╖рддрд╛ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдЬреЛ рдПрдХ рдЧрд╣рд░реА рдЦрд░рдЧреЛрд╢ рдЫреЗрдж рд╣реИред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрд╕рдХрд╛ "рддреЗрдЬрд╝" рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдлрд╝реНрд▓реЛрдЯ 64 рдореЗрдВред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, @ kno10 , рдХрд┐ рдпрд╣ рд╕рдЯреАрдХ рдХреЗ рд╕рд╛рде рдореБрджреНрджреЛрдВ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдзреАрдореА-рдзреАрдореА-рд▓реЗрдХрд┐рди-рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдЪреНрдЫрд╛ рдФрд░ рддреЗрдЬрд╝ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рд╣реИ?

рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдПрдлрдкреА 32 рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд┐рд░реНрдл 3-4 рдЕрдВрдХ, рдФрд░ рдПрдлрдкреА 64 рдХреЗ рд╕рд╛рде 7-8 рдЕрдВрдХреЛрдВ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡реГрджреНрдзрд┐ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдпрд╣ рдирд╣реАрдВ рд╣реИ

рдмрд╣реБрдд рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдЙрддрдирд╛ рд╣реА рд╡реНрдпрд╛рдкрдХ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ - рдпрд╣ рдЬреНрдпрд╛рджрд╛рддрд░ рдирдореВрдиреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЖрдкрд╕реА рджреВрд░реА рдЙрдирдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдЫреЛрдЯреА рд╣реИред

рдиреАрдЪреЗ рдХрд╛ рдЖрдВрдХрдбрд╝рд╛ рдЗрд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, 2e6 рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирдореВрдирд╛ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ 1D рдирдореВрдиреЗ рдЕрдВрддрд░рд╛рд▓ [-100, 100] рдореЗрдВ рд╣реИрдВред рд╕реНрдХрд┐рдЯрд┐рдЯ-рд▓рд░реНрди рдФрд░ рд╕реНрдХрд┐рдкреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреАрдЪ рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдХреЛ рдирдореВрдиреЗ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд▓реЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдирдХреЗ рдПрд▓ 2 рдорд╛рдирджрдВрдбреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред

d_norm(A, B) = d(A, B) / sqrt(тАЦAтАЦтВВ*тАЦBтАЦтВВ)

(рдпрдХреАрди рдирд╣реАрдВ рдХрд┐ рдпрд╣ рд╕рд╣реА рдкреИрд░рд╛рдЯреНрд░рд┐рдЬреЗрд╢рди рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдкреИрдорд╛рдиреЗ рдкрд░ рдХреБрдЫ рд╣рдж рддрдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕),
euclidean_distance_precision_1d

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,

  1. рдпрджрд┐ рдХреЛрдИ [10000] рдФрд░ [10001] L2 рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рджреВрд░реА 1e-4 рд▓реЗрддрд╛ рд╣реИ рдФрд░ рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдкрд░ рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ 64 рдмрд┐рдЯ рдореЗрдВ 1e-8 рдФрд░ 32 рдмрд┐рдЯ (1e) рдореЗрдВ> 1 рд╣реЛ рдЬрд╛рдПрдЧреА -8 рдФрд░> 1 рдирд┐рд░рдкреЗрдХреНрд╖ рдореВрд▓реНрдп рдореЗрдВ рдХреНрд░рдорд╢рдГ)ред 32 рдмрд┐рдЯ рдореЗрдВ рдпрд╣ рдорд╛рдорд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рднрдпрд╛рдирдХ рд╣реИред
  2. рджреВрд╕рд░реА рддрд░рдл [1] рдФрд░ [10001] , рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ 32 рдмрд┐рдЯ рдореЗрдВ ~ 1e-7, рдпрд╛ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рд╣реЛрдЧреАред

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдорд▓рд╛ 1. рдЕрдХреНрд╕рд░ рдПрдордПрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рд╣реЛрдЧрд╛ред

рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо 2 рдбреА рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕рдорд╛рди рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде, рдЙрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИрдВ,
euclidean_distance_precision_2d

рдмреЗрд╢рдХ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдирдореВрдирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдореАрддрд╛ рдХреЗ рдЕрднрд┐рд╢рд╛рдк рдХреЗ рдХрд╛рд░рдг рдХрд┐рд╕реА рднреА рджреЛ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдзреАрд░реЗ-рдзреАрд░реЗ рдмрд╣реБрдд рд╕рдорд╛рди рдореВрд▓реНрдпреЛрдВ (0 рд╕реЗ рдЕрд▓рдЧ) рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧреА рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдЪрд▓рди рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрдордПрд▓ рдореБрджреНрджрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рдЖрдпрд╛рдореАрддрд╛ рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕ рд╕рдЯреАрдХрддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред n_features=5 рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдиреАрдЪреЗ,
euclidean_distance_precision_5d ред

рддреЛ рдХреЗрдВрджреНрд░рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП, рдХрдо рд╕реЗ рдХрдо 64 рдмрд┐рдЯ рдореЗрдВ, рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдПрдХ рдореБрджреНрджреЗ рдХрд╛ рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЕрдзрд┐рдХ рд╣реИрдВ рддреЛ 2%)ред 50x рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╕реНрдкреАрдб-рдЕрдк (рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╕рдЪрд┐рддреНрд░ рд╣реИ) рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (64 рдмрд┐рдЯ рдореЗрдВ)ред рдмреЗрд╢рдХ [1, 1] рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рдореЗрдВ 1e6 рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдПрдХ рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ 6 рдореЗрдВ рд╡реНрдпрдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрдХ рдмрд╕ рдкрд░реЗрд╢рд╛рдиреА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд╣реИред

(рдЙрдкрд░реЛрдХреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛

рдбреЙрдЯ (x, x) + рдбреЙрдЯ (y, y) -2 рдбреЙрдЯ (x, y) рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рддреЗрдЬрд╝ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЕрдиреБрдорд╛рдирд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдХреА рд╢реБрджреНрдзрддрд╛ (рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ float32 рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡реЗ float32 рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, float64 рдХреЗ рд╕рд╛рде, рд╡реЗ float64 рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред рдЖрдк рдЗрд╕реЗ рдХреБрдЫ рдЯреНрд░рд┐рдХреНрд╕ (рдХрд╣рди рд╕рдорди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рдЦрд░реНрдЪ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдлреНрд▓реЛрдЯ 32 рдХреЛ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рдлрд╝реНрд▓реЛрдЯ64 рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд┐рддрдирд╛ рдУрд╡рд░рд╣реЗрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдХрдо рд╕реЗ рдХрдо рдлреНрд▓реЛрдЯ 32 рдХреЗ рд▓рд┐рдП, рдореЗрд░реА рд╕рдордЭ рдореЗрдВ, рд╕рднреА рд╕рдВрдЧрдгрдирд╛рдПрдВ рдХрд░рдирд╛ рдФрд░ рдлреНрд▓реЛрдЯ 64 рдХреЗ рд░реВрдк рдореЗрдВ рдбреЙрдЯ рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдареАрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

IMHO, рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн (рдЬреЛ рдШрд╛рддрд╛рдВрдХ рдирд╣реАрдВ рд╣реИрдВ, рдмрд╕ рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛рд░рдХ рд╣реИрдВ) рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВ (рдЬреЛ рдЖрдкрдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ "рдкрд╛рд░рдВрдкрд░рд┐рдХ" рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП AVX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдХреНрдпреЛрдВрдХрд┐ рд╕рдо ((xy) * 2) AVX рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИредрдХрдо рд╕реЗ рдХрдо, рдореИрдВ рдХрднреА-рдХрднреА рдХрдо рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рдХрд╛рд░рдг approximate_euclidean_distances рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛, (рдЬреЛ рдХрд┐ рдХрд░реАрдм рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЦрд░рд╛рдм рдХрд░рддрд╛ рд╣реИ, рдЬреЛ * рд╢реБрд░реВ рдореЗрдВ рдареАрдХ рд╣реЛ рд╕рдХрддреА рд╣реИ) , рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛред

@ рдЪрд┐рддреНрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдЖрдк рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ, рдПрдХреНрд╕ рдХреБрдЫ рдЗрд╖реНрдЯрддрдо рдХреА рдУрд░ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╖реНрдЯрддрдо рд╢реВрдиреНрдп рдкрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ (рдпрджрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдХреЗрдВрджреНрд░ рд╣реЛрдЧрд╛, рддреЛ рдЬреАрд╡рди рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛), рдФрд░ рдЕрдВрддрддрдГ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЧреНрд░реЗрдбрд░ рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд▓реНрдЯрд╛ рдореЗрдВ рдХреБрдЫ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕реА рддрд░рд╣, рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдореЗрдВ, рдХреНрд▓рд╕реНрдЯрд░реНрд╕ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рдХреЗрдВрджреНрд░ рд╢реВрдиреНрдп рдХреЗ рдХрд░реАрдм рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдИ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде, рдХреБрдЫ рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде x digit рдХреЗрдВрджреНрд░ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдЯреАрдХ рдореБрджреНрджреЛрдВ рдХреЛ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЪрд░реНрдЪрд╛ рдбрд░рд╛рд╡рдиреА рд╕реАрдЦ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдИрдПрдордУ рд╕реНрдХреИрдкреА рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдпрд╛ рдореБрджреНрджреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рд╕реНрдерд╛рди рд╣реИ: рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдЯреАрдХ рдореБрджреНрджреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореБрджрд╛рдп рдХреЛ рднреА рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдпрд╣рд╛рдВ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рдПрдХ рддреЗрдЬ рд▓реЗрдХрд┐рди рдХреБрдЫ рд╣рдж рддрдХ рдЕрдиреБрдорд╛рдирд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИред рд╣рдореЗрдВ рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдореЗрдВ рдХреБрдЫ рд╕реБрдзрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рдВрдмреА рдЕрд╡рдзрд┐ рдореЗрдВ рдпрд╣ рдЬрд╛рдирдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

32 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП, https://github.com/scikit-learn/scikit-learn/pull/11271 рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореИрдВ рд╕рд┐рд░реНрдл рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдХреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХреЛрдб рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ , рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рди рд╣реЛред

рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @ kno10! (рдореЗрд░реА рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЗрд╕реЗ рдЕрднреА рддрдХ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд▓реЗрддреА рд╣реИрдВ) рдореИрдВ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛ред

рд╣рд╛рдВ, рдореВрд▓ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдЕрднрд┐рд╕рд░рдг рдПрдХ рдореБрджреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

IMHO, рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн (рдЬреЛ рдШрд╛рддрд╛рдВрдХ рдирд╣реАрдВ рд╣реИрдВ, рдмрд╕ рдПрдХ рд╕реНрдерд┐рд░ рдХрд╛рд░рдХ рд╣реИрдВ) рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИрдВ (рдЬреЛ рдЖрдкрдХреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВ) рдФрд░ рдЙрдЪрд┐рдд рддрд░реАрдХрд╛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИред

рдЦреИрд░ 64 рдмрд┐рдЯ рдореЗрдВ рдЙрдирдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ> 10x рдзреАрдорд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░ рдмрд╣реБрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝реЗрдЧрд╛ред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ "рдкрд╛рд░рдВрдкрд░рд┐рдХ" рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП AVX рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдХреНрдпреЛрдВрдХрд┐ рд╕рдо ((xy) ** 2) AVX рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рд╕реБрдВрдмрд╛ (рдЬрд┐рд╕реЗ SSE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП) рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд╡рд░рд┐рдд рднреЛрд▓реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдХреЛрд╢рд┐рд╢ рдХреА,

@numba.jit(nopython=True, fastmath=True)              
def pairwise_distance_naive(A, B):
    n_samples_a, n_features_a = A.shape
    n_samples_b, n_features_b = B.shape
    assert n_features_a == n_features_b
    distance = np.empty((n_samples_a, n_samples_b), dtype=A.dtype)
    for i in range(n_samples_a):
        for j in range(n_samples_b):
            psum = 0.0
            for k in range(n_features_a):
                psum += (A[i, k] - B[j, k])**2
            distance[i, j] = math.sqrt(psum)
    return distance

cdist рдЕрдм рддрдХ (рд▓реЗрдХрд┐рди рдореИрдВ рд╕реБрдВрдмрд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ) рдХреЛ рдбрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдФрд░ fastmath рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВред

рдбреЙрдЯ (x, x) + рдбреЙрдЯ (y, y) -2 * рдбреЙрдЯ (x, y) рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХреЗрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рдо рдЬреЛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЖрдпрд╛рдо рд╣реИ рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рдВрдХреЗрддрди рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ),

def quadratic_pairwise_distance(A, B):
    A2 = np.einsum('ij,ij->i', A, A)
    B2 = np.einsum('ij,ij->i', B, B)
    return np.sqrt(A2[:, None] + B2[None, :] - 2*np.dot(A, B.T))

рдЬрд╣рд╛рдБ рджреЛрдиреЛрдВ einsum рдФрд░ dot рдЕрдм BLAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, рдЕрдЧрд░ рдмреАрдПрд▓рдПрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдКрдкрд░ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рднреА рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ, рдЕрдЧрд░ рдмреАрдПрд▓рдПрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдКрдкрд░ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рдорд╛рди рдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рднреА рдХрд░рддрд╛ рд╣реИред

рд╕рдВред ((X - y) * 2.sum ()) рдХрд░рддрд╛ рд╣реИ* n_samples_x * n_samples_y * n_features * (1 рдШрдЯрд╛рд╡ + 1 рдЬреЛрдбрд╝ + 1 рдЧреБрдгрди)
рдЬрдмрдХрд┐ xx + yy -2x.y рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ
n_samples_x * n_samples_y * n_features * (1 рдЬреЛрдбрд╝ + 1 рдЧреБрдгрди) ред
2 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП 2/3 рдЕрдиреБрдкрд╛рдд рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж,

  • рдкреАрдЖрд░ рдХреЛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░рд┐рдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ https://github.com/scikit-learn/scikit-learn/pull/12136
  • рдХреБрдЫ WIP рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдо https://github.com/scikit-learn/scikit-learn/pull/12142 рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

32 рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрднреА рднреА https://github.com/scikit-learn/scikit-learn/pull/11271 рдХреЛ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рд░реВрдк рдореЗрдВ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ IMO, рдЙрдкрд░реЛрдХреНрдд рдкреАрдЖрд░рдУ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рд░реВрдврд╝рд┐рд╡рд╛рджреА рд╣реИрдВред

FYI рдХрд░реЗрдВ: рдСрдкреНрдЯрд┐рдХреНрд╕ рдореЗрдВ рдХреБрдЫ рдореБрджреНрджреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╕рдордп, рдФрд░ ELKI рд╕реЗ рд╕рдВрджрд░реНрдн рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рддреЗ рд╣реБрдП, рдпреЗ metric="euclidean" рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди metric="minkowski" рд╕рд╛рде рд╕рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВред рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЕрдВрддрд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЖрджреЗрд╢ рдХрд╛ рдХрд╛рд░рдг рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ (рдмрд╕ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рдШрдЯрд╛рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ)ред

https://github.com/kno10/scikit-learn/blob/ab544709a392e4dc7b22e9fd60c4755baf3d3053/sklearn/cluster/tests/test_optics.py#L588

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рдирд╣реАрдВ рдкрдХрдбрд╝рд╛ рдЧрдпрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдХреЛрдИ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЧрдгрдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдкрд╣рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдордЬрдмреВрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рд╡реНрдпрд╛рдкрдХ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╕рдореБрджрд╛рдп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ?

рдЕрднреА рддрдХ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдореБрдЭреЗ рдорд┐рд▓реА, рд╡рд╣ рдереА https://github.com/scipy/scipy/pull/2815 рдФрд░ рдЬреБрдбрд╝реЗ рд╣реБрдП рдореБрджреНрджреЗред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @jeremiedbb рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдПрдХ рд╕рдВрддреЛрд╖рдЬрдирдХ рдЕрднреА рддрдХ рдирд╣реАрдВ :(

рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо BLBL рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ OpenBLAS рдпрд╛ MKL рдХреЗ рд╕рд╛рде рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдЗрд╕рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдбреЙрдЯ рдЯреНрд░рд┐рдХ рдРрд╕рд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ рдЬреЛ рдмреАрдПрд▓рдПрдПрд╕ рд╕реНрддрд░ 3 рдореИрдЯреНрд░рд┐рдХреНрд╕-рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЧреБрдгрди рдЙрдкрдЦрдВрдб рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдЕрдкрдиреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдпрд╛ рддреЛ рдЧрддрд┐ рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рдпрд╛ рд╕рдЯреАрдХрддрд╛ рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рдХрдо рдХрд░рдиреА рд╣реЛрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ, рдкреВрд░реНрдг рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ рдФрд░ рддреЗрдЬрд╝ рд╡рд┐рдзрд┐ рдареАрдХ рд╣реИред рдпрд╣ рддрдм рд╣реИ рдЬрдм "рд╕рдмрд╕реЗ рдирд┐рдХрдЯрддрдо" рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЗрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рдЯреАрдХ рдореБрджреНрджреЗ рддрдм рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬрдм рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдЙрдирдХреЗ рдорд╛рдирджрдВрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИ (рдлреНрд▓реЛрдЯ 32 рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрд╛рдд ~ <1e-4 рдФрд░ float64 рдХреЗ рд▓рд┐рдП ~ <1e-8)ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЛ рдХрд╛рдлреА рдШрдирд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдПрдХ рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рд╕рдорд╛рди рджреВрд░реА рдХреЗ рднреАрддрд░ рджреЛ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдПрдордПрд▓ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рджреЛрдиреЛрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреЗ рдлрд┐рдЯ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдВрдЧреЗред

рдЙрдкрд░реЛрдХреНрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЗрди рдЧрд▓рдд рдСрд░реНрдбрд░ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ 0?)ред рдЬреЛрдбрд╝реАрджрд╛рд░ рджреВрд░реА рдХреА argmin рд╕реНрдерд┐рддрд┐ рдореЗрдВред рд╣рдо рдЧрд▓рдд рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдЙрди рдмрд┐рдВрджреБрдУрдВ рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рдХрдЯрддрдо рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдЕрд░реНрдЧрдорд┐рди рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдореЗрдВ рд╕реЗ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВред рдЗрд╕рдХреЗ 2 рдлрд╛рдпрджреЗ рд╣реИрдВред рдпрд╣ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реИ (рдЕрдм рддрдХ рдореБрдЭреЗ рдХреЛрдИ рдЧрд▓рдд рдЖрджреЗрд╢ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ) рдФрд░ рдпрд╣ рдФрд░ рднреА рддреЗрдЬрд╝ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреБрдЫ рдЧрдгрдирд╛рдУрдВ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдПрдХ рдЦрд╛рдореА, рдЕрднреА рднреА рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрджрд┐ рдЕрдВрдд рдореЗрдВ рд╣рдо рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреВрд░реА рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХреА рдЧрдИ рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реЗ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рд╡реЗ рд╡реИрд╕реЗ рднреА рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИрдВред рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рд╕реЗ рдирд┐рдХрдЯрддрдо рдмрд┐рдВрджреБ рддрдХ рджреВрд░рд┐рдпреЛрдВ рдХреА рдкреБрди: рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рддреЗрдЬрд╝ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рджреВрд░реА рд╣реИред

рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдореИрдВрдиреЗ рд╕реНрдХреЗрд▓реЗрд░ рдореЗрдВ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди_рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╣рд╛рдВ рднреА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ euclidean_distances рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рднрд╛рдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдпрд╣ argmin рдХреЗ рд╕рд╛рде рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд╕рдХреЗред рдлрд┐рд░ рдпреБрдЧреНрдордХ_рдбрд┐рд╕реНрдЯреЗрдВрд╕_рдЕрд░реНрдЧрдорд┐рди рдореЗрдВ рдФрд░ рдкреЗрдпрд░рд╡рд╛рдЗрдЬ_рдбрд┐рд╕реНрдЯреЗрдВрд╕_рдЕрд░реНрдЧреЗрдорд┐рди_рдорд┐рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдмрд╛рдж рдореЗрдВ рдЕрдВрдд рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдиреНрдпреВрдирддрдо рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ)ред

рдЬрдм рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдЕрднреА рддрдХ рд╕рдЯреАрдХ рдПрдХ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ, рдпрд╛ # 12136 рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝реЗрдВред
рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдбреНрд░реЙрдк рдХрд╛рд░рдг рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВред

BLAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд░рд╣рдиреЗ рдХреА рдПрдХ рдФрд░ рд╕рдВрднрд╛рд╡рдирд╛ axpy рд╕рд╛рде nrm2 рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╖реНрдЯрддрдо рд╕реЗ рджреВрд░ рд╣реИред рджреЛрдиреЛрдВ BLAS рд╕реНрддрд░ 1 рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдЖрдпрд╛рдо> 100 рдореЗрдВ рддреЗрдЬ рд╣реЛрдЧрд╛ред
рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЛ BLAS рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП ...

рдЕрдВрдд рдореЗрдВ, рд╡рд╣рд╛рдБ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ upcasting рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣ рдлреНрд▓реЛрдЯ 32 рдХреЗ рд▓рд┐рдП # 11271 рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЧрддрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЖрдзреА рд╣реИ рдФрд░ рд╕рдЯреАрдХ рд░рдЦреА рдЧрдИ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдлрд╝реНрд▓реЛрдЯ64 рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдлреНрд▓реЛрдЯ64 рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдерди рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬ рд╕рдХреЗрдВред рдореИрдВ рдареАрдХ рд╕реЗ рдХреИрд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ float128 рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2 float64 рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╕рдВрднрд╡ рд╣реИред

рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЛ BLAS рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдП ...

рдХреНрдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдЕрдЧрд░ OpenBLAS рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрдВрдЧреЗ ...

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдХрд░рдиреЗ рдФрд░ BLAS рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рд╕рдЯреАрдХ рдЕрдВрддрд░ рдХреНрдпрд╛ рд╣реИ? рд╕реАрдкреАрдпреВ рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдФрд░ рдпрд╣ рддрдп рдХрд░рдирд╛ рдХрд┐ рдХрд┐рд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ? рдпрд╛ рдмрд╕ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд┐рдз рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ?
рдпрд╛ рдЕрдзрд┐рдХ рд╕рдордп / рдКрд░реНрдЬрд╛ рдХреБрд╢рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЦрд░реНрдЪ рдХрд░рддреЗ рд╣реИрдВ?

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рддреЗрдЬ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реЗрдХрд┐рди рд╕реНрдХреЗрд▓реЗрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдирд╛:
https://github.com/droyed/eucl_dist
(рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)

рдпрд╣ рдЪрд░реНрдЪрд╛ рд╕рдВрдмрдВрдзрд┐рдд https://github.com/scipy/scipy/issues/5657 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓рдЧрддреА рд╣реИ

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЬреВрд▓рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ: https://github.com/JuliaStats/Distances.jl/blob/master/README.md#preaches -for-euclidean-and-sqeuclidean
рдпрд╣ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдЯреАрдХ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореЗрд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрддреЗ рд╣реБрдП: рдУрдкрдирдмреАрдПрд▓рдПрдПрд╕ рдХреЗ рдкрд╛рд╕ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рд╣рд╛рде рд╕реЗ рд▓рд┐рдЦреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдирд╣реАрдВ!) рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЧреБрдард▓реА рдЪреБрдирдиреЗ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдВред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдУрдкрдирдмреНрд▓рд╕ рдореЗрдВ рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдЙрди рд╕рднреА рдЧреБрдард▓реА рдХреЛ рд▓рд┐рдЦрдиреЗ / рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП ...

рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдЖрдВрд╢рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ,

рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдВрдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо BLBL рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдЬреИрд╕реЗ рдХрд┐ OpenBLAS рдпрд╛ MKL рдХреЗ рд╕рд╛рде рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

рд╣рд╛рдБ, рдореИрдВ рдпрд╣ рднреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╣рдо рдЗрд╕реЗ BLAS рдореЗрдВ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдорд╛рдирдХ рдмреАрдПрд▓рдПрдПрд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрдЦрд╛, рддреЛ рд╡рд╣ рдХрд╛рдлреА рдХрд░реАрдм рд▓рдЧ рд░рд╣рд╛ рдерд╛ (рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВ рдЙрди рдкрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ)ред BLIS рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗрдкрди рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдо рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╕реАрдорд┐рдд рдЙрдкрдпреЛрдЧ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрд┐рд╕реА рджрд┐рди рд╕реБрдЧреНрд░реАрд╡ https://github.com/numpy/numpy/issues/7372)

рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдЬреВрд▓рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдкреБрдирд░реНрдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдЯреАрдХ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЬрд╛рди рдХрд░ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛!

рдХреНрдпрд╛ рд╣рдореЗрдВ рдЙрдкрд░реНрдпреБрдХреНрдд рддреЗрдЬреА рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдореБрджреНрджрд╛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП? рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИ

X2-x4 рдХреЗ CPU рдкрд░ рдЙрдирдХрд╛ рд╕реНрдкреАрдбрдЕрдк https://github.com/scikit-learn/scikit-learn/pull/10212 рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╡рд╣рд╛рдБ рдкрд░ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдБ рдореБрдЭреЗ рдЙрдЪрд┐рдд рд╕рдорд╛рдзрд╛рди рдорд┐рд▓реЗрдЧрд╛ (рдФрд░ рдлрд┐рд░ рд╕рдВрднрд╡рддрдГ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реЗрдирд╛) рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рд╣реИ, рдЬреЛ рдПрдордПрд▓ рдХреЗ рдмрд╛рд╣рд░ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рдХреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред (рдФрд░ рд╕рд╛рде рд╣реА рд╕рдЯреАрдХрддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд╣рд╛рдВ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рд░рд╛рдп рд╣реЛрдирд╛ рд╣реЗрд▓рдлрдкреБрд▓ рд╣реЛрдЧрд╛)ред

рдпрд╣ 60x рддрдХ рд╣реИ, рд╣реИ рдирд╛?

рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рддреЗрдЬ рдЕрд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реЗрдХрд┐рди рд╕реНрдХреЗрд▓реЗрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рдирд╛

рд╣рдо рдЙрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд╡реЗ %timeit pairwise_distances(a,b, 'sqeuclidean') рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рд╕реНрдХреИрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ %timeit pairwise_distances(a,b, 'euclidean', metric_params={'squared': True}) рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрдирдХрд╛ рд╕реНрдкреАрдбрдЕрдк рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ :)
рдЬреИрд╕рд╛ рдХрд┐ рдЪрд░реНрдЪрд╛ рдореЗрдВ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реНрдХреЗрд▓реЗрд░рди рд╕реНрдХрд┐рдкреА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 35x рддреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рд╣рд╛рдВ, рд╡реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗрд╡рд▓ ~ 30% рдмреЗрд╣рддрд░ рд╣реИрдВ metric="euclidean" ( squeclidean рдмрдЬрд╛рдп),

In [1]: from eucl_dist.cpu_dist import dist                                                                                                                  
    ... import numpy as np                                                                                                                                   
In [4]: rng = np.random.RandomState(1)                                                                                                                        
    ... a = rng.rand(1000, 300)                                                                                                                              
    ...b = rng.rand(1000, 300)                                                                                                                              

In [7]: from sklearn.metrics.pairwise import pairwise_distances                                                                                              
In [8]: %timeit pairwise_distances(a, b, 'sqeuclidean')                                                                                                      
214 ms ┬▒ 2.06 ms per loop (mean ┬▒ std. dev. of 7 runs, 1 loop each)

In [9]: %timeit pairwise_distances(a, b)                                                                                                                     
27.4 ms ┬▒ 2.48 ms per loop (mean ┬▒ std. dev. of 7 runs, 10 loops each)

In [10]: from eucl_dist.cpu_dist import dist                                                                                                                 
In [11]: %timeit dist(a, b, matmul='gemm', method='ext', precision='float32')                                                                                
20.8 ms ┬▒ 330 ┬╡s per loop (mean ┬▒ std. dev. of 7 runs, 10 loops each)

In [12]: %timeit dist(a, b, matmul='gemm', method='ext', precision='float64')                                                                                
20.4 ms ┬▒ 222 ┬╡s per loop (mean ┬▒ std. dev. of 7 runs, 10 loops each)

рдХреНрдпрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛? рдЕрдЧрд░ OpenBLAS рдХрд░рддрд╛ рд╣реИ рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЕрдЪреНрдЫреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрдВрдЧреЗ ...

рд╕реАрдзреА рдЖрд╡рд╛рдЬ рдирд╣реАрдВ рдХрд░рддрд╛ред рдмреАрдПрд▓рдПрдПрд╕ рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рджрд┐рдирдЪрд░реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдРрдирдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡реЗ рдирдП рдлреАрдЪрд░реНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдЦреБрд▓реЗ рд╣реИрдВ рдореВрд▓ рдЪрд╢реНрдореЗ рдореЗрдВ рдирд╣реАрдВред рдЙрд╕рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдмреНрд▓рд┐рд╕ рдЕрдзрд┐рдХ рдЦреБрд▓реА рд╣реЛрдЧреА рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рд╣реИред

sqeuclidean vs euclidean рд╣реИрдВрдбрд▓рд┐рдВрдЧ pairwise_distances https://github.com/scikit-learn/scikit-learn/issues/12600 рдкрд░ рдЦреЛрд▓рд╛ рдЧрдпрд╛ред

рдореБрдЭреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯрддрд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рд╣рдо pairwise_distances рдкрд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - all_close ' рдХреЗ рдЕрд░реНрде рдореЗрдВ - 'рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди' рдФрд░ 'рд╕рд┐рдХреНрд╡реНрдпреВрдХреНрд▓рд╛рдЗрдбреАрди' рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП?

рдпрд╣ рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ x, y рдХреЗ рдХрд░реАрдм рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ x┬▓ y y рдХреЗ рдХрд░реАрдм рд╣реИред рд╕реНрдХреНрд╡реЗрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдЦреЛ рдЬрд╛рддреА рд╣реИред

рдКрдкрд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рдЬреВрд▓рд┐рдпрд╛ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реАрдзрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдпрд╣ 'sqeuclidean' рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдХреА рдУрд░ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреА рд╣реЛрдЧреАред

рдмрд╣реБрдд рдХрдо рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреБрди: рдЕрднрд┐рдХрд▓рди рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдПрдХ рдмрдбрд╝реА рдмреВрдВрдж рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЖрдпрд╛рдо рд╕реЗ рдХрдо рд╣реИред рдПрдХ рд╣реА рджрд╣рд▓реАрдЬ рдЙрдЪреНрдЪ рдЖрдпрд╛рдо (рджреВрд░рд┐рдпрд╛рдВ рдмрдбрд╝реА рд╣реИрдВ) рдореЗрдВ рдХрдо рдкреБрдирдГ рдЧрдгрдирд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ред

рд╢рд╛рдпрдж рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рдЖрдпрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдирд┐рдореНрди рдЖрдпрд╛рдореА рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдзреАрдореА рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд┐рдд рдПрдХ (рд╡реИрд╕реЗ рднреА рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдШрдмрд░рд╛рд╣рдЯ рдФрд░ рд╕реНрдХреЗрд▓реЗрд░ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ) рдФрд░ рдЙрдЪреНрдЪ рдЖрдпрд╛рдореА рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬ + рджрд╣рд▓реАрдЬред

рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╢рд╛ рдХреА рдПрдХ рдЭрд▓рдХ рд╣реЛ рд╕рдХрддреА рд╣реИ :)

рдпрд╣рд╛рдВ рд╕реНрдХреИрдкреА рдФрд░ рд╕реНрдХреЗрд▓реЗрд░ рдХреЗ рдмреАрдЪ рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИрдВред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕рднреА рдЖрдХрд╛рд░реЛрдВ рдХреЗ Xs рдХреЗ рд▓рд┐рдП sklearn.metrics.pairwise.euclidean_distances(X,X) scipy.spatial.distance.cdist(X,X) рдХрд░рддреЗ рд╣реИрдВред рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 2тБ┤ (16) рд╕реЗ 2 8 (8192) рддрдХ рдЬрд╛рддреА рд╣реИ, рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 2тБ░ (1) рд╕реЗ 2 1 (8192) рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдореЗрдВ рдорд╛рди рд╕реНрдХреЗрд▓реЗрд░ рдмрдирд╛рдо рд╕реНрдХреИрдкреА рдХрд╛ рд╕реНрдкреАрдбрдЕрдк рд╣реЛрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд 1 рд╕реНрдХреЗрд▓реЗрд░ рд╕реЗ рдиреАрдЪреЗ рдзреАрдорд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ 1 рд╕реНрдХреЗрд▓реЗрд░ рд╕реЗ рдКрдкрд░ рддреЗрдЬ рд╣реЛрддрд╛ рд╣реИред

рдкрд╣рд▓рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ BLAS рдХреЗ MKL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
bench_euclidean_mkl_1

рджреВрд╕рд░рд╛ рд╡реНрдпрдХреНрддрд┐ BLAS рдХреЗ OpenBLAS рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ MKL рдФрд░ OpenBLAS рджреЛрдиреЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдорд╛рди рд╣реИред
bench_euclidean_openblas_1

рддреАрд╕рд░рд╛ рдПрдордПрд▓рдПрд▓ рдмреАрдПрд▓рдПрдПрд╕ рдФрд░ 4 рдХреЛрд░ рдХреЗ рдПрдордХреЗрдПрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ euclidean_distances рдХреЛ BLAS LEVEL 3 рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди cdist рдХреЗрд╡рд▓ BLAS LEVEL 1 рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд▓рдЧрднрдЧ рд╕реАрдорд╛ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
bench_euclidean_mkl_4

рдЬрдм n_samples рдмрд╣реБрдд рдХрдо (> 100) рдирд╣реАрдВ рд╣реИ, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реАрдорд╛ 32 рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реИред рд╣рдо n_features <32 рдФрд░ euclidean_distances n_features> 32 рдХреЗ рджреМрд░рд╛рди cdist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рддреЗрдЬ рд╣реИ рдФрд░ рдХреЛрдИ рд╕рдЯреАрдХ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рдпрд╣ рднреА рдлрд╛рдпрджрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрдм n_features рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЬреВрд▓рд┐рдпрд╛ рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреБрди: рд╕рдВрдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рд╕реАрдбреАрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм n_features> 32, рд╣рдо euclidean_distances рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреВрд▓рд┐рдпрд╛ рджрд╣рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред рджрд╣рд▓реАрдЬ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ euclidean_distances рдмрд╣реБрдд рдзреАрдорд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЗрддрдиреА рдЕрдзрд┐рдХ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рдХреБрдЫ рдкреБрди: рд╕рдВрдЧрдгрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред

@jeremiedbb рдорд╣рд╛рди, рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред

рдУрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдлреНрд▓реЛрдЯ64 рдХреЗ рд▓рд┐рдП рдерд╛, рд╣реИ рдирд╛? рд╣рдо рдлреНрд▓реЛрдЯ 32 рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ? рд╣рдореЗрд╢рд╛ рдмрдирд╛ рд░рд╣рд╛? рдЕрдкрд╕реНрдЯреНрд░реАрдо> 32 рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП?

рдореИрдВрдиреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдзреНрдпрд╛рди рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ (рдЬрд▓реНрдж рд╣реА рд╣реЛрдЧрд╛), рдмрд╕ FYI рдХрд┐ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рдЗрд╕рдХреА рд╕реАрдорд╛рдПрдВ рд╣реИрдВ, # 12128 рджреЗрдЦреЗрдВ

@ qinhanmin2014 рд╣рд╛рдВ, рдлреНрд▓реЛрдЯ64 рд╕рдЯреАрдХ рдХреА рд╕реАрдорд╛рдПрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдЯреАрдХ рд╣реИ рдХрд┐ рдореИрдВ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп fp32 рдкрд░рд┐рдгрд╛рдо рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ fp64 рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╕реНрдЯреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ scipy рд╕реЗ cdist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд╕реНрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рджреЗрдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдорд▓реНрдЯреА-рдХреЛрд░ рдмреАрдПрд▓рдПрдПрд╕ рднреА рдЖрдо рддреМрд░ рдкрд░ рддреЗрдЬ рдирд╣реАрдВ рд╣реИ ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдЙрдЪреНрдЪ рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ (64 рдЖрдпрд╛рдореЛрдВ рд╕реЗ рдЕрдзрд┐рдХ) рдХреЗ рд▓рд┐рдП рдкрдХрдбрд╝ рд╣реИ, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд▓рд╛рдн рдЖрдо рддреМрд░ рдкрд░ рдкреНрд░рдпрд╛рд╕ IMHO рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ) - рдФрд░ рдЪреВрдВрдХрд┐ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░рд┐рдпрд╛рдВ рдШрдиреЗ рдЙрдЪреНрдЪ рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ IMHO рдХрд╛ рдорд╣рддреНрд╡ рдирд╣реАрдВ рд╣реИред ред рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ 10 рд╕реЗ рдХрдо рдЖрдпрд╛рдо рд╣реЛрдВрдЧреЗред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реАрдбреАрд╕реНрдЯ рдЖрдорддреМрд░ рдкрд░ рддреЗрдЬ рд╣реЛ рдЧрдпрд╛ рд╣реИ?

рдУрд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдлреНрд▓реЛрдЯ64 рдХреЗ рд▓рд┐рдП рдерд╛, рд╣реИ рдирд╛?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдлреНрд▓реЛрдЯ 32 рдФрд░ рдлреНрд▓реЛрдЯ64 рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ (рдореЗрд░рд╛ рдорддрд▓рдм рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ)ред рдореИрдВ рд╣рдореЗрд╢рд╛ c_ist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдЬрдм n_features <32ред

рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ fp64 рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд╕реНрдЯреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ scipy рд╕реЗ cdist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд╕реНрддрд╛ рд╣реИред

Upcasting ~ 2 рдХреЗ рдПрдХ рдХрд╛рд░рдХ рд╕реЗ рдордВрджреА рд╣реЛрдЧреА рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ n_features = 64 рдХреЗ рдЖрд╕рдкрд╛рд╕ рд▓рдЧрддрд╛ рд╣реИред

рдХрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ 10 рд╕реЗ рдХрдо рдЖрдпрд╛рдо рд╣реЛрдВрдЧреЗред

рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЕрднреА рднреА рдЙрдЪреНрдЪ рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг @jeremiedbb !

рдХрдо рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрдм cdist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, FYI scipy рдХреА рд╕реАрдбреАрд╕реНрдЯ рдЕрдкрд╕реНрдЯреЙрдХреНрд╕ рдлреНрд▓реЛрдЯ 32 рд╕реЗ рдлреНрд▓реЛрдЯ64 https://github.com/scipy/scipy/issues/8771#issuecomment -384015674, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдЯреАрдХрддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рдХрд╛рд░рдг рд╣реИред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ https://github.com/scikit-learn/scikit-learn/pull/12601#pullrequestestview -176076355, рд╕рдВрднрд╡рддрдГ рдореЗрдВ рд╕реБрдЭрд╛рдП рдЧрдП "рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо" рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ euclidean_distance рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИред "рдХреЛрдИ рдирд╣реАрдВ" рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде рддрд╛рдХрд┐ рдпрд╣ рднреА рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЬреИрд╕реЗ рдХрд┐ https://github.com/scikit-learn/scikit-learn/pull/12136ред

рд╕реНрдерд┐рд░ рдорд╛рдирджрдВрдбреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Eigen3 рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рд╣реИ: https://eigen.tuxfamily.org/dox/StableNorm_8h_source.html (рдЬреЛ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ)

рдЕрдЪреНрдЫреА рд╡реНрдпрд╛рдЦреНрдпрд╛, рдореЗрд░реА рд╕рдордЭ рдореЗрдВ рд╕реБрдзрд╛рд░

рд╣рдордиреЗ рд╕реНрдкреНрд░рд┐рдВрдЯ рдкрд░ рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рдХреА рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╢рд╛рдпрдж ... рдФрд░ @ рдЖрдЬ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рд╣реИред

рдпрджрд┐ рдЖрдк рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВред рд╢рд╛рдпрдж рджреЛрдкрд╣рд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ?

рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП,

рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдореЗрдВ рд╕рдЯреАрдХ рдореБрджреНрджреЛрдВ рдХреЗ рд▓рд┐рдП,

  • рдирд┐рдореНрди рдЖрдпрд╛рдореА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ @jeremiedbb рдиреЗ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛, рд╣рдореЗрдВ рд╢рд╛рдпрдж cdist рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдЙрдЪреНрдЪ рдЖрдпрд╛рдореА рдорд╛рдорд▓реЗ рдФрд░ рдлреНрд▓реЛрдЯ 32 рдореЗрдВ, рд╣рдо рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ,

    • рдЪреВрдирд┐рдВрдЧ, 64 рдмрд┐рдЯ рдореЗрдВ рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдФрд░ рд╕рдорд╡рд░реНрддреА

    • рдорд╛рдорд▓реЛрдВ рдореЗрдВ cdist рдХрд╛ рдЧрд┐рд░рдирд╛ рдЬрдм рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ (рдХреИрд╕реЗ рдПрдХ рдЦреБрд▓рд╛ рд╕рд╡рд╛рд▓ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП scipy рддрдХ рдкрд╣реБрдВрдЪ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ https://github.com/scikit-learn/scikit-learn/issues/9354#uuecomment-438522881 )

рдлрд┐рд░ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди, рд╕реНрдХреНрд╡реЗрдпреБрдХреНрд▓рд┐рдбрд┐рдпрди, рдорд┐рдВрдХреЛрд╡рд╕реНрдХреА, рдЖрджрд┐ рдХреЗ рдмреАрдЪ рд╡рд┐рд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЗ рд╕рднреА рдореБрджреНрджреЗ рд╣реИрдВред

рдкреВрд░реНрд╡рд╛рдзрд╛рд░реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, @amueller рдФрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рддреНрд╡рд░рд┐рдд рдЪреИрдЯ рдереА, рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рд▓рд┐рдП рдЬреЗрд░реЗрдореА рдХреЛ рджреВрдз рдкрд┐рд▓рд╛рддреА рдереАред рдЙрдирдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рдЙрдЪреНрдЪ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдПрдордПрд▓ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдореЗрдВ рдЗрддрдирд╛ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЬреЗрд░реЗрдореА рдиреЗ рдпрд╣ рднреА рдЖрд░реЛрдк рд▓рдЧрд╛рдпрд╛ рдХрд┐ рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреБрд╢рд▓ рдкрд░реАрдХреНрд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ (cf. # 12142)

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдлреНрд▓реЛрдЯ 32 рдХреЗ рд▓рд┐рдП upcasting рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рд╡рд░реНрддреА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ рдЦреБрд╢ рд╣реИрдВред рдЪреВрдБрдХрд┐ cdist рднреА float64 рдХреЗ рд▓рд┐рдП upcasts рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо cdist рдХреЛ float32 (рд▓реЗрдХрд┐рди float64 рд╕рдВрдЪрд╛рдпрдХ рдХреЗ рд╕рд╛рде) рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрди: рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдпрджрд┐ рд╣рдо рдХрдо-рдордВрдж рдлреНрд▓реЛрдЯ 32 рдореЗрдВ рдХрдо рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ chunking рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ @Celelibi # 11271 рдореЗрдВ PR рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХреЛ (рд╣рдо рдореЗрдВ рд╕реЗ?) рдХреЛ рдкреВрд░реНрдг рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдФрд░ рдПрдХ рдмрд╛рд░ рдпрд╣ рддрдп рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ sqeuclidean рдФрд░ minkowski рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (p in {0,1}) рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣рдордиреЗ рдирд┐рдпрд░реЗрд╕реНрдЯреЗрдиреЗрдмрд░реНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕рдВрдЧрддрд┐ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА рд╣реИред рдПрдХ рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЯ :)

рд╕реНрдкреНрд░рд┐рдВрдЯ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдЪрд░реНрдЪрд╛ рдХреЗ рдмрд╛рдж рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реБрдП:

  • рдЙрдЪреНрдЪ рдЖрдпрд╛рдореА рдорд╛рдорд▓реЗ рдореЗрдВ (> 32 рдпрд╛> 64 рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЪреБрдирддреЗ рд╣реИрдВ): рд╡рд┐рдЦрдВрдбреВ рджреНрд╡рд╛рд░рд╛ рдлреНрд▓реЛрдЯ64 рддрдХ рдмрдврд╝рд╛рдПрдВ рдЬрдм рдпрд╣ рдлреНрд▓реЛрдЯ 32 рд╣реИ рдФрд░ 'рддреЗрдЬрд╝' рд╡рд┐рдзрд┐ рд░рдЦреЗрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдВрдЦреНрдпрд┐рдХ рдореБрджреНрджреЗ, рдлреНрд▓реЛрдЯ64 рдкрд░, рд▓рдЧрднрдЧ рдирдЧрдгреНрдп рд╣реИрдВ (рдореИрдВ рдЙрд╕ рдХреЗ рд▓рд┐рдП рдорд╛рдирджрдВрдб рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛)

  • рдирд┐рдореНрди рдЖрдпрд╛рдореА рдорд╛рдорд▓реЗ рдореЗрдВ: рд╕реНрдХреЗрд▓реЗрд░ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЧрдгрдирд╛ (рдЙрдкрд╣рд╛рд╕ рдХреЗ рдХрд╛рд░рдг рдЦреБрд░рдЪрдиреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп) рд▓рд╛рдЧреВ рдХрд░реЗрдВред

(рдпрд╣ рдлреНрд▓реЛрдЯ 32 рдореЗрдВ рднреА рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдХреЛ рдлреЗрдВрдХрдиреЗ рдХрд╛ рдкреНрд░рд▓реЛрднрди рджреЗ рд░рд╣рд╛ рд╣реИ)

рдпрд╣рд╛рдВ рд╕реНрдХреИрдкреА рдФрд░ рд╕реНрдХреЗрд▓реЗрд░ рдХреЗ рдмреАрдЪ рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИрдВред
[... рд╕реНрдирд┐рдк ...]

рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдкрд╛рдпрд╛ред рд╕рд┐рд╡рд╛рдп рдореИрдВ рдПрдХ рдирд┐рдЪрд▓реА рдирд┐рд░реНрдгрдп рд╕реАрдорд╛ рдХреА рд╡рдХрд╛рд▓рдд рдХрд░реВрдВрдЧрд╛ред рдореЗрд░рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ 8 рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ред

heatmap

рдЧрд▓рдд рд╣реЛрдиреЗ рдХреА рд▓рд╛рдЧрдд рд╕рдордорд┐рдд рдирд╣реАрдВ рд╣реИред cdist рдХреЗрд╡рд▓ рдХреБрдЫ рд╕реЗрдХрдВрдб рд╕реЗ рдХрдо рд╕рдордп рддрдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ рдлреАрдЪрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рдиреЗ рдкрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рдВрджреЗрд╣ рд╣реЛрдиреЗ рдкрд░ рдмреАрдПрд▓рдПрдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдпрд╣ рдмреЗрдВрдЪрдорд╛рд░реНрдХ Float64 рдХреЗ рд▓рд┐рдП рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдлреНрд▓реЛрдЯ64 рддрдХ рдХреЗ рдлреНрд▓реЛрдЯ 32 рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЛ рдХреЗрд╡рд▓ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рдХреБрд▓ рд╕рдордп рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рд╢рдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЬрд┐рд╕ рдорд╢реАрди рдкрд░ рдЖрдк рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ, рдЙрд╕ рд╕реАрдорд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ AVX рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдПрдХ рдорд╢реАрди рдкрд░ рдЪрд▓рд╛рдП рдЧрдП рдереЗ рдЬрд┐рд╕рдореЗрдВ рдПрд╡реАрдПрдХреНрд╕ 2 рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдереЗ, рдХреЗрд╡рд▓ рдПрд╡реАрдПрдХреНрд╕ред рдФрд░ рдПрдХ рдорд╢реАрди рдкрд░ рдЬреЛ AVX2 рд╣реИ, рдореБрдЭреЗ рдЖрдкрдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗред

рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдЯреАрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣реИ рдФрд░ рдЬрдм рдЖрдпрд╛рдо рдЫреЛрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдореЗрдВ рд╕рдЯреАрдХ рдореБрджреНрджреЗ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдзрд┐рдХ рд╣реЛрддреА рд╣реИред рд╢рд╛рдпрдж 16 рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордЭреМрддрд╛ рд╣реИред рддреБрдо рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реЛ ?

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рд╕реВрдЪрд┐рдд рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЗ рдкреАрдЖрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рдЯреАрдХрддрд╛ рдЕрдм рдХреЛрдИ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдорд╣рдВрдЧреА рдЧрдгрдирд╛ рдХреА рдХреАрдордд рдкрд░ред рдЗрд╕рд▓рд┐рдП рд╕рдВрднрд╡рддрдпрд╛ рдЖрдкрдХреЗ рдкреАрдЖрд░ рдХреЛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рд╕рдЯреАрдХрддрд╛ рдЗрддрдиреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдХрдард┐рди рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдФрд░ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдХреЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░, рдЖрдк рд╕рд╕реНрддреА рд╕реАрдкреАрдпреВ рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдЯреАрдХрддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣реАрдВ рдФрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ 10000000.01 рдФрд░ 10000000.00 рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ fp64 рдХреЗ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЬреНрдЮрд╛рдд-рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕рдореАрдХрд░рдг, fp32 рдХреЗ рд╕рд╛рде 10000 рдФрд░ 10001 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред 1024 рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

>>> import sklearn.metrics.pairwise as sk, scipy.spatial.distance as sp
>>> X = [[10000.01] * 1024, [10000.00] * 1024]
>>> print(sk.euclidean_distances(X,X), "\n", sp.cdist(X,X))
[[ 0.          0.31895195]
 [ 0.31895195  0.        ]] 
 [[ 0.    0.32]
 [ 0.32  0.  ]]

(рдпрд╣ 0.19.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛) рд╕рд╣реА рджреВрд░реА 0.32 рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЕрд╕реНрдерд┐рд░рддрд╛ рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рд╡рд┐рд░рд▓ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣рд╛рдВ, рдкрд░рд┐рдгрд╛рдо рдореЗрдВ FP64 рдХреЗ рд╕рд╛рде рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рджреЛ рдЕрдВрдХ рдХрдо рд╣реИрдВред

13410 рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рдд рдлреНрд▓реЛрдЯ64 + рдЙрдЪреНрдЪ рдЖрдпрд╛рдоред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдлрд╝реНрд▓реЛрдЯ 32 рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдлреНрд▓реЛрдЯ64 + рдЙрдЪреНрдЪ рдордВрдж рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдЯреАрдХрддрд╛ рдХреЗ рдореБрджреНрджреЗ рдмрд╣реБрдд рдХрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдФрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, X [0] рдФрд░ X [1] рдХреЗ рдкрд╛рд╕ 320000.32 рдФрд░ 320000 рдХреЗ рдмрд░рд╛рдмрд░ рдорд╛рдирджрдВрдб рд╣реИрдВ рдФрд░ рдЙрдирдХреА рджреВрд░реА 0.32 рд╣реИ, рдЕрд░реНрдерд╛рдд 1e-6 рдЙрдирдХреЗ рдорд╛рдирдХ рд╕реЗред рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ, 16 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрдХ (рдлреНрд▓реЛрдЯ64 рдореЗрдВ) рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВред

рд▓реЗрдХрд┐рди рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдлреНрд▓реЛрдЯ64 + рдЙрдЪреНрдЪ рдордВрдж рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдЯреАрдХрддрд╛ рдХреЗ рдореБрджреНрджреЗ рдмрд╣реБрдд рдХрдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдФрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдкрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред

рдореИрдВ рдЗрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╕рдВрдпрдд рд░рд╣реВрдВрдЧрд╛ред рдЖрдпрд╛рдореА рдХреЛ рдХрдо рдХрд░рдирд╛ рдПрдордПрд▓ рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрджрдо рд╣реИред рдПрдордбреАрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдХреЛрдИ рдлрд╝реНрд▓реЛрдЯ64 рдорд╛рдорд▓реЗ рдХреА рд╕рдЯреАрдХрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдордзреНрдпрд╡рд░реНрддреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдлрд╝реНрд▓реЛрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢рд┐рдХреНрд╖рд╛ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред
ftp://ftp.math.ethz.ch/users/wpp/CELL/qd.pdf

рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЙрдЪреНрдЪ рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдорд╢реАрди рд╕реАрдЦрдиреЗ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдлреНрд▓реЛрдЯ64 рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдЯреАрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рдРрд╕реЗ рдмрд┐рдВрджреБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рджреВрд░реА рдЙрдирдХреЗ рдорд╛рдирджрдВрдбреЛрдВ рд╕реЗ рдЫреЛрдЯреЗ рдкрд░рд┐рдорд╛рдг рдХреЗ 6 рдЖрджреЗрд╢ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХрд╛ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ

рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ, 16 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрдХ (рдлреНрд▓реЛрдЯ64 рдореЗрдВ) рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВред

рдореИрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рд╕рдЪ рд╣реИред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдореЗрдВ 16 рдореЗрдВ рд╕реЗ 15 рдЕрдВрдХ рдЦреЛ рджрд┐рдП рд╣реИрдВред рдореИрдВ рд╕рд╣рдордд рд╣реВрдБ рдЕрдЧрд░ рд╣рдо рд╕рдЯреАрдХ рдХрд╛ рдЖрдзрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред рдорд╛рдк рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдХреНрд╕рд░ FP64 рд╕реЗ FP32 рддрдХ рдХрд╛ рдиреБрдХрд╕рд╛рди рд╕рд╣рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдПрдлрдкреА 64 рдХреЗ рд╕рд╛рде рдЙрдкрднреЛрдХреНрддрд╛-рдЧреНрд░реЗрдб рдЬреАрдкреАрдпреВ рдПрдлрдкреА 32 рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рддреЗрдЬ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП (рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╡реЗ рдПрдлрдкреА 32 рдбреЗрдЯрд╛ рдФрд░ рдПрдлрдкреА 64 рд╕рдВрдЪрдпрдХреЛрдВ рдХреЛ рдЕрдм рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐), рдФрд░ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯреНрд░реЗрдВрд╕ рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдм int8 рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╣ рд╣рд░ рдЬрдЧрд╣ рдкрдХрдбрд╝ рдирд╣реАрдВ рд╣реИред

K-рд╕рд╛рдзрди рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рд╕рдореВрд╣реЛрдВ рдЙрдирдХреЗ рд╕рд╛рдзрди рдореЗрдВ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ (рдФрд░ рд╣реИ рдХрд┐ рд╣рдо рдХрд╛ рдорддрд▓рдм рд╣реИ рдкрд╣рд▓реЗ рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ), рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдореЗрдВ рдПрдХ рдиреБрдХрд╕рд╛рди рдпрд╣рд╛рдБ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рдХреНрд▓рд╕реНрдЯрд░ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рдЕрд▓рдЧрд╛рд╡ рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдЙрдирдХреЗ рдХреБрдЫ рдорд╛рдирджрдВрдб рдмрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓реЗ рд╢реБрд░реБрдЖрддреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХреА рджреВрд░реА рдореЗрдВ рдЕрдХреНрд╕рд░ рдЫреЛрдЯреЗ рдЕрдВрддрд░ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдмрд┐рдВрджреБ рдХреЛ рджреВрд╕рд░реЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХрд╛ рдиреБрдХрд╕рд╛рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрд╕реНрдерд┐рд░рддрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдХрдИ рдЪрд░ рдХреЗ рд╕рд╛рде рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЯреБрдХрдбрд╝реЗ рдкрд░ k- рд╕рд╛рдзрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдмрдврд╝рддреЗ рд╣реБрдП рдбреЗрдЯрд╛ рд╕рд╛рдЗрдЬрд╝ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕реА рд╕реЗ рджреВрд░реА рдЫреЛрдЯреА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЬрдм рддрдХ рдЖрдкрдХреЗ рдорд╛рдирджрдВрдб 0 рдирд╣реАрдВ рд╣реЛрддреЗ, рд╡реЗ рдЕрдВрддрддрдГ рд╡реЗрдХреНрдЯрд░ рдорд╛рдирджрдВрдбреЛрдВ рд╕реЗ рдЫреЛрдЯреЗ рд╣реЛрдВрдЧреЗ рдФрд░ рд╕рдорд╕реНрдпрд╛рдПрдБ рдкреИрджрд╛ рдХрд░реЗрдВрдЧреЗред рддреЛ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдЖрдХрд╛рд░ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдФрд░ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЖрдпрд╛рдореАрддрд╛ рдХрд╛ рдЕрднрд┐рд╢рд╛рдк рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдФрд░ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рджреВрд░реА рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИ; рдЗрд╕рд▓рд┐рдП рд╕рд╣реА рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕реА рд░реИрдВрдХрд┐рдВрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЙрдЪреНрдЪ-рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдореЗрдВ рдЕрдЪреНрдЫреА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред 20news рдбреЗрдЯрд╛ рд╕реЗрдЯ рдкрд░, рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдЧреИрд░-рд╢реВрдиреНрдп рджреВрд░реА рд▓рдЧрднрдЧ 0.02 (рдорд╛рдирджрдВрдб рд╕рднреА 1 рд╣реИрдВ)ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл 10k рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ рдХрд╛рдлреА рд╡рд┐рд╡рд┐рдз рд╕рд╛рдордЧреНрд░реА рд╣реИред рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд▓рдЧрднрдЧ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдерд╛ ...

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ "рдЕрд╕рдВрднрд╛рд╡рд┐рдд" рдПрдордПрд▓ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ ... рдмреЗрд╢рдХ рдпрд╣ рд╕рднреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЬрдм рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ "рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ, 16 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрдХ (рдлреНрд▓реЛрдЯ64 рдореЗрдВ) рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВред", рдореИрдВ рдЧрдгрдирд╛ рдХреА рдЧрдИ рджреВрд░реА рдХреА рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдбреЗрдЯрд╛ рдПрдХреНрд╕ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ, рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдПрдХ рдорд╛рдк рд╕реЗ рдЖрддрд╛ рд╣реИ, рдФрд░ 9 рд╡реЗрдВ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдЯреАрдХ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реИ (рдХрдг рднреМрддрд┐рдХреА рдореЗрдВ рдмрд╣реБрдд рдХрдо рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред
рддреЛ рдЖрдкрдХреЗ 10000000.01 рдФрд░ 10000000.00 рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк 0.01 рдХреА рджреВрд░реА рдкрд░ рдХреБрдЫ рдорд╣рддреНрд╡ рдХреИрд╕реЗ рджреЗрдВрдЧреЗ рдЬрдм рдПрдХреНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдЖрдкрдХреА рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдмрдбрд╝реА рд╣реЛ?

рдХреЗрдорд┐рдпрдВрд╕ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдПрдХ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдЕрд╡рд▓реЛрдХрди рдПрдХреНрд╕ рдХреЗ рдирд┐рдХрдЯрддрдо рдХреЗрдВрджреНрд░ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рджреВрд░рд╕реНрде рдЧрдгрдирд╛ рдореЗрдВ рдПрдХреНрд╕ рдХреЗ рдЖрджрд░реНрд╢ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред
рдлрд┐рд░, рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рдореА рдХреЗ рд╕рдореВрд╣ред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдЗрдХрдЯреНрдард╛ рд╣реЛрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдБ 0 рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдорд╛рдЗрдЧреНрд░реЗрди рдПрдХ рдЕрдиреБрдорд╛рди рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ 2 рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдореЛрд░реНрдЪреЗ рдкрд░ рдореМрдЬреВрдж рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 2 рд╕рдореВрд╣реЛрдВ рдХреА рд╕рдорд╛рди рджреВрд░реА рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреА рдЖрдкрдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреНрдпрд╛ рд╣реИ? рдореЗрд░рд╛ рдпрд╛ рддреЛ 2 рдХреНрд▓рд╕реНрдЯрд░ рд╣реИ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдХреЗрдорд┐рдпрд╛рдВ рдореЗрд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрд╣рдВрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдХрд┐рдореА рднреА рдореБрдЭреЗ рдХреБрдЫ рд╣рдж рддрдХ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕реАрдорд╛рдВрдд рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ)ред

рдХреЗрд╡рд▓ "| b | ^ 2-2ab" рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдирд┐рд░рд╕реНрддреАрдХрд░рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрдХреЛ рдореЗрдВ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдореЗрдВ рд╕рдорд╛рди рдиреБрдХрд╕рд╛рдиред рдкрд░рд┐рдгрд╛рдо рд╡рд╣реА рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдкрдиреЗ рдмрд╛рдж рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рджреВрд░реА рдкрд░ рдПрдХ рдХрд╛ рдорд╛рди рдЬреЛрдбрд╝рд╛; рдпрджрд┐ рджреВрд░реА рдХрд┐рд╕реА рдХреЗ рдорд╛рдирджрдВрдб рд╕реЗ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ BLAS рд╣реИрдХ рдХреЗ рдмрд┐рдирд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

K- рд╕рд╛рдзрди рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рд╣реИред рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╣реИрдХ рдХрд╛ рдорддрд▓рдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреЗрд▓реЗрд░реЛрди рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдмрджрддрд░ рд╕рдорд╛рдзрд╛рди рдкрд╛рддрд╛ рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЕрд╕реНрдерд┐рд░рддрд╛ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рд╕реНрдХреЗрд▓реЗрд░ рдХрд┐рдореА рдХреЛ рд╕рдорд╛рди рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ max_iter рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕реБрдзрд╛рд░ (рдорд╛рди рд▓реЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЗрд╖реНрдЯрддрдо рдХреЛ рдвреВрдВрдврдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╣рдирд╛ рдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рдЕрд╕рдВрднрд╡ рд╣реИред
рдЬрдм рддрдХ рдХреЗ-рд╕рд╛рдзрди рдЕрднрд┐рд╕рд░рдг рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рдЖрдк рджреЛ рд╕рдорд╛рди рд╕рдореВрд╣реЛрдВ рдХреЗ "рд╕рдорд╛рди" рджреВрд░реА рд╡рд╛рд▓реЗ рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред рдЕрдЧрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рд╕рд╛рдзрди рдЪрд▓реЗ рдЧрдП рд╣реИрдВ рдФрд░ рдЕрдВрддрд░ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдФрд░ рдорд╛рдорд▓рд╛ рдмрди рд╕рдХрддрд╛ рд╣реИ!
рдореИрдВ k- рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реЛрд░ рдбреЗрдЯрд╛ рдкрд░ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реА рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрднрд╛рд▓рддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрджрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдкреВрд░реНрдг рдЧреБрдгрд╡рддреНрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВ рд╣рдореЗрд╢рд╛ tol=0 рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ) рдФрд░ рдЗрд╕реЗ рдЬрд╝рд░реВрд░рдд рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдЦрд╝рд░рд╛рдм рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЙрдЪрд┐рдд рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╕реНрддрд╛ рд╣реИ (рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдорд╕реНрдпрд╛рдПрдВ рдбреЗрдЯрд╛ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ - рдЗрд╕рд▓рд┐рдП рдЫреЛрдЯреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП, рдзреАрдореЗ рд░рдирдЯрд╛рдЗрдо рдЖрдорддреМрд░ рдкрд░ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ)ред

рдЖрд╡реЗрджрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, 10000000.01 рдФрд░ 10000000.00 рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдорд╛рдпрдиреЗ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдпрд╛, рдпрджрд┐ рдЖрдк рдХрдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкрд╣рд▓реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВред Fp32 рдореЗрдВ рдПрдХ рд╣реА рдлреАрдЪрд░ рдХреЗ рд╕рд╛рде 10000 рдФрд░ 10001 рдЬрд┐рддрдирд╛ рдХрдо рд╣реИ рдФрд░ 100 рдХреЗ рд╕рд╛рде 101 рдмрдирд╛рдо 100 рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ:

рдЬреИрд╕рд╛ рдХрд┐ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдорд╛рдзреНрдп рдХрд╛ рдПрдХ рднреМрддрд┐рдХ рдЕрд░реНрде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЦреЛрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд▓реНрд╡рд┐рди рдореЗрдВ рддрд╛рдкрдорд╛рди рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╣реИ, рддреЛ рдЖрдк 0: 1 рдХреЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдХреЗрдВрджреНрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЬреЛ рдЖрдкрдХреЗ рдЕрдиреБрдкрд╛рдд рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджреЗрдЧрд╛ред рдЕрдм рдпрджрд┐ рдЖрдк рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╕реНрдЯреАрд▓ рдЙрддреНрдкрд╛рдж рдХреЗ рддрд╛рдкрдорд╛рди рдХреА рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдардВрдбрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреВрд▓ рдбрд╛рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЖрдкрдХреЗ рд╕реНрдЯреАрд▓ рдЙрддреНрдкрд╛рдж рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрд▓реНрдбрд╛рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ 700 K рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рддрд╛рдкрдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╕реИрдХрдбрд╝реЛрдВ рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрдирдкреБрдЯ рд╕реАрд░реАрдЬрд╝ рдХреЗ рдХреЗрд╡рд▓ 5 рдЕрдВрдХреЛрдВ (0.01K) рдХреЗ рд╕рд╛рде рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рд╕рд╛рде рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЖрдк рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдХреЗрд╡рд▓ 1-2 рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдк рдПрдордПрд▓ рдореЗрдВ рдХрднреА рднреА рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдкреНрд░рднрд╛рд╡ рд╣реИрдВред рдЗрд╕рдХреА рдПрдХ рдЕрд▓рдЧ рдЕрдЧрд░ рдЖрдк рд╣рдореЗрд╢рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ 10 рдореЗрдВ рд╕реЗ 16 рдЕрдВрдХреЛрдВ рдХреЛ рд╕рдЯреАрдХ рдХрд╣реЗрдВред рдпрд╣рд╛рдВ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ 0 рдЕрдВрдХ рд╕рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рднрдпрд╛рд╡рд╣ рд╣реИ)ред

рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЗрдВ, рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдПрдХ рдорд╛рдк рд╕реЗ рдЖрддрд╛ рд╣реИ, рдФрд░ 9 рд╡реЗрдВ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдЯреАрдХ рдЙрдкрд╛рдп рдирд╣реАрдВ рд╣реИ (рдХрдг рднреМрддрд┐рдХреА рдореЗрдВ рдмрд╣реБрдд рдХрдо рд▓реЛрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рд╕реЗ рдХрдЪреНрдЪреЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдЯреАрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣ рд╕рд╣реА рд╣реИред рд▓реЗрдХрд┐рди рдПрдордПрд▓ рдЙрд╕ рддрд░рд╣ рдХреЗ рдЗрдирдкреБрдЯ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ рдЧрдгрд┐рддреАрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП ML рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдорд╛рдгрд┐рдХ рдХреА рдХреНрдпреВрдм рдЬреИрд╕реА рдкрд╣реЗрд▓реА рдХреЗ рдЧреНрд░рд╛рдл рдкрд░ MDS рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдпрд╛ рдкреИрдбрдореИрди рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓реЗ RL рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдЭреБрдВрдб рджреНрд╡рд╛рд░рд╛ рдкрд╛рдИ рдЧрдИ рд╕рдлрд▓ рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХрд░рдирд╛ред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╕реВрдЪрдирд╛ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрд░реЛрдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рдордзреНрдп-рдорд╛рд░реНрдЧ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдВрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдкрд░ рдПрдХ рдврд╛рд▓ рд╡рдВрд╢ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рддрд░рд╣ рдЬрд┐рд╕рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдирдореВрдирд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЕрднреА рднреА рдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рд╕реНрдХреЛрд░-рд▓рд░реНрди рдХреЛ рдЯреНрд░реЗрдб-рдСрдл рд╕рдЯреАрдХрддрд╛ рдмрдирд╛рдо рдХрдореНрдкреНрдпреВрдЯреЗрд╢рди рд╕рдордп рдореЗрдВ рдЕрдкрдирд╛ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЬреЛ рдХреЛрдИ рднреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИ рдЙрд╕реЗ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреЗрд╡рд▓ "| b | ^ 2-2ab" рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдирд┐рд░рд╕реНрддреАрдХрд░рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЕрдВрддрд░ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрдХреЛ рдореЗрдВ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдореЗрдВ рд╕рдорд╛рди рдиреБрдХрд╕рд╛рдиред рдкрд░рд┐рдгрд╛рдо рд╡рд╣реА рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдкрдиреЗ рдмрд╛рдж рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рджреВрд░реА рдкрд░ рдПрдХ рдХрд╛ рдорд╛рди рдЬреЛрдбрд╝рд╛; рдпрджрд┐ рджреВрд░реА рдХрд┐рд╕реА рдХреЗ рдорд╛рдирджрдВрдб рд╕реЗ рдмрд╣реБрдд рдЫреЛрдЯреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ BLAS рд╣реИрдХ рдХреЗ рдмрд┐рдирд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреВрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХрд╛ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рднрдпрд╛рд╡рд╣ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрди рд╕рдХрддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЬрдм рдП рдФрд░ рдмреА рдХрд░реАрдм рд╣реИрдВ), рдФрд░ рдЖрдк рдпрд╣ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреВрд░реА рдкрд░ рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ (рдЬреЛ рджреВрд░реА рдирд╣реАрдВ рд╣реИ) рдЫреЛрдЯреА рд░рд╣рддреА рд╣реИред
KMeans рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╣рд╛рдВ рдЖрдк рдХреЗрд╡рд▓ рдирд┐рдХрдЯрддрдо рдХреЗрдВрджреНрд░ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдСрд░реНрдбрд░ рдХреЛ рд╕рд╣реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдЯреАрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЕрдВрдд рдореЗрдВ рдЖрдк рдЬрдбрд╝рддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдЯреАрдХ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗрдВрджреНрд░ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЗрдордиреНрд╕ рдПрдХ рдЙрддреНрддрд▓ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рднрд▓реЗ рд╣реА рдЖрдк рдЗрд╕реЗ рдЯреЛрд▓ = 0 рдХреЗ рд╕рд╛рде рдЕрднрд┐рд╕рд░рдг рддрдХ рдЪрд▓рдиреЗ рджреЗрдВ, рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп рдорд┐рдиреАрдорд╛ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдорд┐рдиреАрдорд╛ (рдХрд┐рдореА рдХреЗ рд╕рд╛рде + рдЖрд░рдВрднреАрдХрд░рдг) рд╕реЗ рднреА рджреВрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ init рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрдИ рдмрд╛рд░ kmines рдЪрд▓рд╛рдКрдВрдЧрд╛ред рдЖрдкрдХреЗ рдкрд╛рд╕ рдмреЗрд╣рддрд░ рд╕реНрдерд╛рдиреАрдп рдорд┐рдиреАрдорд╛ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХрд╛ рдмреЗрд╣рддрд░ рдореМрдХрд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдЖрдк рдЕрднрд┐рд╕рд░рдг рддрдХ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд╕реЗ рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреВрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдмрдбрд╝реА рдордирдорд╛рдиреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЧрд▓рдд рдирд┐рдХрдЯрддрдо рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП tf-idf рдкрд░ рдЬрд╣рд╛рдБ рдорд╛рдорд▓рд╛ рд╣реИ | рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╡реИрдХреНрдЯрд░ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИрдВред рдлрд┐рд░ ab рднреА 1 рдХреЗ рдХрд░реАрдм рд╣реИ, рдФрд░ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреА рд╕рдЯреАрдХрддрд╛ рдЦреЛ рдЪреБрдХреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рддреНрд░реБрдЯрд┐ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд┐рдкрддреНрддрд┐рдкреВрд░реНрдг рд░рджреНрджреАрдХрд░рдг рди рд╣реЛред рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ 8 рдЕрдВрдХреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреВрд░реА 0.000012345678 рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ FP32 рдФрд░ рдирд┐рдпрдорд┐рдд рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрда рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреЗ рд╕рд╛рде, рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп ab ab = 0.99998765432 рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ FP32 рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ 0.99998765 рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдиреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рддреАрди рдЕрдВрдХ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЦреЛ рджрд┐рдПред рдиреБрдХрд╕рд╛рди рдЙрддрдирд╛ рд╣реА рдмрдбрд╝рд╛ рд╣реИ, рдЬрд┐рддрдирд╛ рддрдмрд╛рд╣реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВред рдпрджрд┐ рдорд╛рдирджрдВрдб рд╕реЗ рджреВрд░реА рдмрд╣реБрдд рдХрдо рд╣реИ, рддреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЦрд░рд╛рдм рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╣рд╛рдБ, kmeans рдЙрддреНрддрд▓ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рддрдм рдЖрдк рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЗрд╖реНрдЯрддрдо рдвреВрдВрдврдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдФрд░ рдЕрдЯрдХ рди рдЬрд╛рдПрдВ (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреЛрд▓рди рднреА рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдореА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИрдВ) рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдмрд╣реБрдд рдХрдо рд╣реИред рддреЛ рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд▓реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдФрд░ рдХрдИ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд╕рд╛рде рд╡реИрд╢реНрд╡рд┐рдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд┐рд╕ рдЪреАрдЬ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд╡рд╣ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдлреНрд▓реЛрдЯрд┐рдВрдЧ 64 рддрдХ рдЪреАрдЬреЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рдЬреЛ рдХрд░ рд░рд╣реЗ рдереЗ, рдЙрд╕рд╕реЗ рднреА рдмрджрддрд░ рдирд╣реАрдВ рд╣реИред рдЙрд╕ рд▓рд┐рд╣рд╛рдЬ рд╕реЗ @Celelibi рдХрд╛

рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдХреНрдпрд╛ рдЖрдк рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рд╣рдо рдЙрдЪреНрдЪ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕рдЯреАрдХ рдЧрдгрдирд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореИрдВрдиреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдлреНрд▓реЛрдЯ64 рдорд╛рдорд▓реЗ рдХреА рдФрд╕рдд рд╕рдЯреАрдХрддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рдпрд╛ рд╣реИред рдореИрдВ 3 рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ: neumaier_sum((x-y)**2) , numpy.sum((x-y)**2) рдФрд░ X2 - 2*X.dot(Y.T) + Y2.T ред рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо 256 рдмрд┐рдЯреНрд╕ рдХреА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде mpmath рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
X рдФрд░ Y рдореЗрдВ 100 рдирдореВрдиреЗ рдФрд░ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдФрд░ -2 рдФрд░ 2 рдХреЗ рдмреАрдЪ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рднрд░реЗ рд╣реБрдП рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд gif рдкрд░, рдкреНрд░рддрд┐ рдирдВрдмрд░ рдПрдХ рдЫрд╡рд┐ рд╣реИ (1 рдФрд░ 200 рдХреЗ рдмреАрдЪ)ред рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдбреЙрдЯ X 10000 Y рдХреЗ рд╡реИрдХреНрдЯрд░ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рдмреАрдЪ рд╡рд░реНрдЧреАрдп рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдкреЗрдХреНрд╖рддрд╛ рддреНрд░реБрдЯрд┐ рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП 2 ^ 53 рд╕реЗ рдЧреБрдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬреЛ ULP рдЗрдХрд╛рдИ рд╕реЗ рд▓рдЧрднрдЧ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рд╡рдХреНрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╡рд┐рддрд░рдг (рдХрд░реНрдиреЗрд▓ рдШрдирддреНрд╡ рдЕрдиреБрдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рд╣реИрдВред

float64_relerr

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд░реЗрдЦрд╛рдВрдХрди рдкрдардиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП 6 ULP рдкрд░ рдХрд╛рдЯрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдФрд╕рдд рдорд╛рдорд▓реЗ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдЗрд╕рд╕реЗ рднреА рдмрджрддрд░ рд╕реНрдерд┐рддрд┐ рдХреЛред рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реВрддреНрд░ рдХреА рддреНрд░реБрдЯрд┐ рдмрд╣реБрдд рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдореЗрд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдпрд╣ рд╣реИ рдХрд┐ рдФрд╕рддрди, рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реВрддреНрд░ рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдмрдбрд╝реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд▓реНрджреА рд╕реЗ рдЕрдВрддрд░ рдФрд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдпреЛрдЧ рдХреЗ рд╕рдорд╛рди рд╣реЛ рдЬрд╛рддреА рд╣реИред рджрд╣рд▓реАрдЬ 5 рдФрд░ 10 рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╣реИред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реВрддреНрд░ рдФрд░ рд╕рд╛рде рд╣реА рдкреИрдереЛрд▓реЙрдЬрд┐рдХрд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдКрдкрд░реА рдмрд╛рдзреНрдп рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ kno10 рдХреА рдЪрд┐рдВрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдХреНрд╕рд░ рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ
рдЕрдВрдХ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ рдпреВрдирд┐рдЯ рд╣реЛрддреЗ рд╣реИрдВ
рдЖрджрд░реНрд╢ред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЖрд╢реНрд╡рд╕реНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмреАрдПрд╕ рдирд╣реАрдВ рд╣реИред ^^

рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП: рд╕реВрддреНрд░ x┬▓+y┬▓-2ab рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдЕрдмрд╛рдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдЬрдм рддрдХ рдореЗрд░рд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЧрд▓рдд рдирд╣реАрдВ рд╣реИ, рдЬрдм x рдФрд░ y рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдХрд░реАрдм рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ 2^(52*2) ред рдХрдо рд╕реЗ рдХрдо рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдореИрдВрдиреЗ рдЬреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдорд╛рдорд▓рд╛ рдкрд╛рдпрд╛ рд╣реИ, рд╡рд╣ 2^52+1 рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рд╣реИред

>>> a, b = (0xfffffec4d6282+1) * 2.0**(511-52), 0xfffffec4d6282 * 2.0**(511-52)
>>> a, b
(6.703903473040778e+153, 6.7039034730407766e+153)
>>> exactdiff = (a-b)**2
>>> exactdiff
2.2158278651204453e+276
>>> computeddiff = a**2 + b**2 - 2*a*b
>>> computeddiff
-9.9792015476736e+291
>>> abs((computeddiff - exactdiff) / exactdiff)
4503599627370497.0
>>> bin(int(abs((computeddiff - exactdiff) / exactdiff)))
'0b10000000000000000000000000000000000000000000000000001'

рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рдВрдХреЗрдд рдХреЛ рдлрд╝реНрд▓рд┐рдк рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рд╕рдЪреНрдЪрд╛рдИ рдХреЗ рдХрд░реАрдм рдмрдирд╛ рджреЗрдЧрд╛ред рдпрд╣ рд╕рдмрд╕реЗ рдирд╛рдЯрдХреАрдп рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ a рдФрд░ b рдХреЗ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрдХ рдХреЛ рдмрджрд▓рдирд╛ рд░рд┐рд╢реНрддреЗрджрд╛рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

>>> a, b = (0xfffffec4d6282+1) * 2.0**(-52), 0xfffffec4d6282 * 2.0**(-52)
>>> a, b
(0.9999999266202912, 0.999999926620291)
>>> exactdiff = (a-b)**2
>>> computeddiff = a**2 + b**2 - 2*a*b
>>> abs((computeddiff - exactdiff) / exactdiff)
4503599627370497.0

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ULPs рдореЗрдВ рдПрдХ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдкреНрд▓реЙрдЯ рдЙрдкрд░реЛрдХреНрдд ULP рддреНрд░реБрдЯрд┐ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдПрдиреАрдореЗрд╢рди рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рддреЛ 0 ULP рддреНрд░реБрдЯрд┐ рдФрд░ 1 ULP рддреНрд░реБрдЯрд┐ "рдЬрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ"ред 2 рд╡рд░реНрдЧрдкрд╛рд░реНрдЯ рдХреА рд╡рдЬрд╣ рд╕реЗ ULP рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ рднреА рдмрдбрд╝реА рддреНрд░реБрдЯрд┐ рдореИрдВ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред

(computed - exact) / exact рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рддрдХ рдЙрдЪрд┐рдд рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рдЯреАрдХ рдмрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдореЗрдВ рд╕рдЯреАрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЪреБрдиреМрддрд┐рдпрд╛рдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╛рдлреА рдЕрд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, (computed-exact)/norm рдмрдЬрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рдорд╛рд░реА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рди рдХрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рджреВрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВред
рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдПрдХ рдЖрдпрд╛рдореА рдореВрд▓реНрдп рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ 1 ULP рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ, рдФрд░ 2 ULP рдХреА рддреНрд░реБрдЯрд┐ рдмрд╣реБрдд рдмрдбрд╝реА рд▓рдЧ рд╕рдХрддреА рд╣реИ; рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЕрд╕реНрдерд┐рд░ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрдИ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

(1, 1e-16) рдмрдирд╛рдо (1, 2e-16) рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рддреЛ рдХрд╣реЗрдВ, MNIST рдореЗрдВ рдПрдХ рд╕рдлреЗрдж рдкрд┐рдХреНрд╕реЗрд▓ред
рдЕрдВрддрд░-рдЖрдзрд╛рд░рд┐рдд рд╕рдореАрдХрд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рдареАрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдбреЙрдЯ-рд╕рдВрд╕реНрдХрд░рдг рдореБрд╢реНрдХрд┐рд▓ рдореЗрдВ рдкрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЗрд╕реАрд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдпрд╛рдореА рдкреНрд░рдпреЛрдЧ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ ULPs рдореЗрдВ рдПрдХ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдкреНрд▓реЙрдЯ рдЙрдкрд░реЛрдХреНрдд ULP рддреНрд░реБрдЯрд┐ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде рдПрдиреАрдореЗрд╢рди рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рдкреНрд░рддрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рддрд┐ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдХ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рд╣реЛрдЧрд╛ред рд╡рд╣рд╛рдБ рдПрдХ 3 рдбреА рд╕рд╛рдЬрд┐рд╢ рдпрд╛ рдПрдХ рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБред

(computed - exact) / exact рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рддрдХ рдЙрдЪрд┐рдд рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рдЯреАрдХ рдмрдбрд╝рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдореЗрдВ рд╕рдЯреАрдХ рдорд╛рди рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдЪреБрдиреМрддрд┐рдпрд╛рдВ рдорд┐рд▓ рд░рд╣реА рд╣реИрдВ, рддреЛ рдпрд╣ рдХрд╛рдлреА рдЕрд╕реНрдерд┐рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рд╕реЗ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рдЗрд╕реЗ рд╕рдЯреАрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
(рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЛрд▓рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдЕрдкрдиреЗ рдкреНрд▓реЙрдЯ рдореЗрдВ рднреА рдордирдорд╛рдиреА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдереА, рдмрд┐рд▓реНрдХреБрд▓ рдЧреЛрд▓ рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдпред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреНрд▓реЙрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдЕрдЬреАрдм рд▓рд╣рд░реЗрдВ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИрдВред)

рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, (computed-exact)/norm рдмрдЬрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛рдиреА рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рдорд╛рд░реА рджреВрд░реА рдХреА рдЧрдгрдирд╛ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рди рдХрд┐ рд╡реНрдпреБрддреНрдкрдиреНрди рджреВрд░реА рдХреА рддреБрд▓рдирд╛ рдореЗрдВред

рдпрджрд┐ рдореИрдВ рдЖрдкрдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рддреЛ рдЖрдк рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдкрд░рд┐рдорд╛рдг рдореЗрдВ рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВрдЧреЗред рд╡реЗрдХреНрдЯрд░ рдорд╛рдирджрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рдХреЗ рдкрд░рд┐рдорд╛рдг рдХреЗ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдорд╛рдк рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдирд╛ред рдЬрдмрдХрд┐ рдорд╛рдирдХ рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдЗрд╕рдХреА рддреБрд▓рдирд╛ рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рдХреА рднрдпрд╛рд╡рд╣рддрд╛ рд╕реЗ рдХрд░рддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдЖрдк рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо

  • рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдХрд┐рддрдиреЗ рдЕрдВрдХ рдЕрдХреНрд╖рдо рд╣реИрдВред
  • рджрд░рдЕрд╕рд▓, рдЕрдзрд┐рдХрд╛рдВрд╢ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕реНрдХреЛрд░ 1e-15 рд╕реЗ рдХрдо рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реВрддреНрд░ (рдбреЙрдЯ-рдЖрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо) рдХрд╛ рд╕реНрдХреЛрд░ 5 ULP (рдЗрдирдкреБрдЯ) (рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдЕрдиреБрдорд╛рди) рд╕реЗ рдШрд┐рд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рдкреВрд░рд╛ рдкреНрд░рдорд╛рдг рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдерд╛ред
  • рдФрд░ рдЪреВрдВрдХрд┐ рджреЛрдиреЛрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ computed - exact рдХреЗрд╡рд▓ рдПрдХ рдЙрдиреНрдирдд рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ, рд╡реЗ рдПрдХ рд╣реА рдЗрдирдкреБрдЯ рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рд░реИрдВрдХ рдХрд░реЗрдВрдЧреЗред
    рддреЛ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдмрд╕ рдореВрд▓реНрдп рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрдо рдЙрдкрдпреЛрдЧреА (IMO) рдХреЗ рд╕рд╛рдеред

(1, 1e-16) рдмрдирд╛рдо (1, 2e-16) рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рддреЛ рдХрд╣реЗрдВ, MNIST рдореЗрдВ рдПрдХ рд╕рдлреЗрдж рдкрд┐рдХреНрд╕реЗрд▓ред
рдЕрдВрддрд░-рдЖрдзрд╛рд░рд┐рдд рд╕рдореАрдХрд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рдареАрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдбреЙрдЯ-рд╕рдВрд╕реНрдХрд░рдг рдореБрд╢реНрдХрд┐рд▓ рдореЗрдВ рдкрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЗрд╕реАрд▓рд┐рдП рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдпрд╛рдореА рдкреНрд░рдпреЛрдЧ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдбреЙрдЯ-рдЖрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ 1 рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдЯреАрдХ рдкрд░рд┐рдгрд╛рдо рдЬрд┐рддрдиреА рдмрдбрд╝реА рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдХреЛрдИ рдЕрдВрдХ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдФрд░ рдЖрдкрдХреЗ рдореАрдЯреНрд░рд┐рдХ рдХрд╛ рдореВрд▓реНрдп 1e-16 рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдорд╛рдирдХ рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖, рдХреЗрд╡рд▓ 16 рд╡рд╛рдВ рдЕрдВрдХ рдмрдВрдж рд╣реИред
рдореИрдВ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЕрдЧрд░ рд╣рдо рдЕрднреА рднреА рдлреНрд▓реЛрдЯ64 рдХреЗ рд╕рд╛рде рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди_рдбрд┐рд╕реНрдЯреЗрдВрд╕ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЛ рдПрдХ рдирдП рдореБрджреНрджреЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣рд╛рдВ 100 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

rth picture rth  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vitorcoliveira picture vitorcoliveira  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

StevenLOL picture StevenLOL  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

shauli-ravfogel picture shauli-ravfogel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dfee picture dfee  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ