Scikit-learn: float32๋ฅผ ์‚ฌ์šฉํ•œ euclidean_distances์˜ ์ˆ˜์น˜ ์ •๋ฐ€๋„

์— ๋งŒ๋“  2017๋…„ 07์›” 13์ผ  ยท  102์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: scikit-learn/scikit-learn

๊ธฐ์ˆ 

sklearn.metrics.pairwise.pairwise_distances ํ•จ์ˆ˜๋Š” np.float64 ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•  ๋•Œ 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 ์—์ด์ „ํŠธ ๋ฌด๋ฆฌ๊ฐ€ ์ฐพ์€ ์„ฑ๊ณต์ ์ธ ์ „๋žต์„ ํด๋Ÿฌ์Šคํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆ˜ํ•™ ๋ฌธ์ œ์— ML์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ •๋ณด์˜ ์ดˆ๊ธฐ ์†Œ์Šค๊ฐ€ ์‹ค์ œ ์„ธ๊ณ„์ธ ๊ฒฝ์šฐ์—๋„ ๋Œ€๋ถ€๋ถ„์˜ ์ˆซ์ž๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ด€๋ จ์‹œํ‚ค๋Š” ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ ์„ธ๊ณ„์—์„œ ํ†ต๊ณ„์ ์œผ๋กœ ์ƒ˜ํ”Œ๋ง ๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฝ์‚ฌ ํ•˜๊ฐ• ๋ฒ•์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์™œ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ๋…ผ์˜ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘ scikit-learn์ด ๊ณ„์‚ฐ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ ˆ์ถฉ ์ •ํ™•๋„์—์„œ ์ตœ์„ ์„ ๋‹คํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์ƒํƒœ์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์€ ํ’€ ์š”์ฒญ์„ ์ œ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  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๋Š” ๋” ๋†’์€ ์ •๋ฐ€๋„์˜ ๋ˆ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค, ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์–ด์š”
๊ณ ์น  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2017 ๋…„ 7 ์›” 19 ์ผ ์˜ค์ „ 12:05์— "nvauquie" [email protected]์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ 3.5์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ :

Darwin-15.6.0-x86_64-i386-64 ๋น„ํŠธ
Python 3.5.1 (v3.5.1 : 37a07cee5969, 2015 ๋…„ 12 ์›” 5 ์ผ, 21:12:44)
[GCC 4.2.1 (Apple Inc. ๋นŒ๋“œ 5666) (3 ์ )]
NumPy 1.11.0
SciPy 0.18.1
Scikit-Learn 0.17.1

์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ์—์„œ๋งŒ ๋ฐœ์ƒํ•˜๋ฉฐ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์žฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ง์ ‘ sklearn.metrics.pairwise.euclidean_distances :

์ˆ˜์ž… scipy
sklearn.metrics.pairwise ๊ฐ€์ ธ ์˜ค๊ธฐ

์„œ๋กœ ๋งค์šฐ ์œ ์‚ฌํ•œ 64 ๋น„ํŠธ ๋ฒกํ„ฐ a์™€ b ์ƒ์„ฑ

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)

a ๋ฐ b์˜ 32 ๋น„ํŠธ ๋ฒ„์ „ ์ƒ์„ฑ

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

64 ๋น„ํŠธ ๋ฐ 32 ๋น„ํŠธ ๋ชจ๋‘์— ๋Œ€ํ•ด sklearn์„ ์‚ฌ์šฉํ•˜์—ฌ a์—์„œ b๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

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)

print (dist_64_sklearn)
print (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์— ๋Œ€ํ•œ ๋‹ต์€ 0์ด๊ณ  np.float 64์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ans๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

@jnothman ๊ทธ๋Ÿผ ๋‚ด๊ฐ€ ๋ญ˜ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‹ˆ? ์œ„์˜ ์˜๊ฒฌ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ฌธ์ œ๋Š” ์•„๋งˆ๋„ sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y)) ์‚ฌ์šฉํ•˜์—ฌ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์ ์ด product-then-sum๋ณด๋‹ค ๋œ ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์ œ๊ฐ€ ๋งํ•˜๋ ค๋Š” ๊ฒƒ์€ dot์ด product-then-sum๋ณด๋‹ค ๋” ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
-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]]

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ ํ•จ์ˆ˜๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ์œ„์—์„œ ์˜๋ฏธ ํ•œ ๋ฐ”๋ฅผ ๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด sum-then-product๋Š” numpy ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ๋„ ์ •๋ฐ€๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋ณต์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋บ„์…ˆ์„ํ•˜๋Š” ๊ฒƒ์ด ๋ณด์ž…๋‹ˆ๋‹ค.
์ฐจ์ด์˜ ์ •๋ฐ€๋„๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ํ•˜๊ธฐ
๊ณฑํ•œ ๋‹ค์Œ ๋นผ๊ธฐ (๋˜๋Š” ๋ถ€์ •ํ•˜๊ณ  ๋”ํ•˜๊ธฐ)ํ•ฉ๋‹ˆ๋‹ค.
์ตœ์ƒ์œ„ ์ˆซ์ž๊ฐ€ ๋‹ค์Œ๋ณด๋‹ค ํ›จ์”ฌ ํฌ๊ธฐ ๋•Œ๋ฌธ์—์ด ์ •๋ฐ€๋„๋ฅผ ์žƒ์Šต๋‹ˆ๋‹ค.
์ฐจ์ด์ ๋“ค.

ํ˜„์žฌ ๊ตฌํ˜„์€ ๋งŽ์€ ์ˆ˜์˜ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.
ํ’๋ชจ. ํ•˜์ง€๋งŒ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๊ฐ€ ์ ์  ๋ฌด์˜๋ฏธ ํ•ด ์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค
๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ถœ๋ ฅ ์ˆ˜์— ์˜ํ•ด ์ง€๋ฐฐ๋ฉ๋‹ˆ๋‹ค.
๊ฐ€์น˜.

๊ทธ๋ž˜์„œ ์ €๋Š” ์ˆ˜์น˜ ์ ์œผ๋กœ ๋” ์•ˆ์ •์ ์ธ ๊ตฌํ˜„์„ ์ฑ„ํƒํ•˜๋Š” ๊ฒƒ์— ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค.
d- ์ ๊ทผ ์ ์œผ๋กœ ํšจ์œจ์ ์ธ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์˜๊ฒฌ,
@ogrisel? @agramfort?

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ตœ๊ทผ์— float32s๋ฅผ ํ—ˆ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํžˆ ๋” ๋งŽ์€ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค.
์ถ”์ •์ž๋“ค ์‚ฌ์ด์—์„œ ๋” ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ์ด ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ product-then-sum์ด np.float64์— ๋Œ€ํ•ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ž…๋ ฅ์„ float64๋กœ ๋ณ€ํ™˜ ํ•œ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  ๋‹ค์‹œ ๋ณ€ํ™˜ ๋œ ๊ฒฐ๊ณผ๋ฅผ float32๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์˜ˆ์—์„œ ์ž˜ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

float64๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์ด ๋” ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋นผ๊ธฐ.

์˜ค, ๋„ค, ์ฃ„์†ก ํ•ฉ๋‹ˆ๋‹ค๋งŒ, float64๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ product-then-sum์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ˜„๋ช…ํ•˜์ง€ ์•Š๋‹ค๋ฉด ๊ณ„์‚ฐ์ ์œผ๋กœ ๋” ํšจ์œจ์ ์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  product-then-sum์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์ด ์•„๋‹ˆ๋ผ ๊ณ„์‚ฐ ํšจ์œจ์„ฑ์ด ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์‹คํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๋ฐฉ๋ฒ•์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ณ„์‚ฐ์ ์œผ๋กœ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
์ค‘๊ฐ„ ๋ฐฐ์—ด. ์ ˆ๋Œ€ ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œํ•œํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค (์˜ˆ :
chunking), ์™œ ๋‚ด์ ์„ ์ทจํ•˜๊ณ  ๊ทœ๋ฒ”์„ ๋‘ ๋ฐฐ๋กœ ๋นผ๊ณ 
๋บ„์…ˆ๊ณผ ์ œ๊ณฑ๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ž…๋‹ˆ๊นŒ?

๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์ œ๊ณต ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ข‹์•„ ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋นผ๊ธฐ ํ›„ ์ œ๊ณฑ๊ณผ float64 ๋กœ์˜ ๋ณ€ํ™˜์— ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. . ๋˜ํ•œ @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

์ƒ˜ํ”Œ ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ˜ํ”Œ ์ˆ˜์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ์˜ ์ˆ˜ ... ๊ทœ๋ฒ”์„ ์ทจํ•˜๋ฉด ์ผ๋ถ€๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ด์ ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ƒ˜ํ”Œ ์Œ๋‹น ํ•œ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ์ƒ˜ํ”Œ ๋‹น ํ•œ ๋ฒˆ

2017 ๋…„ 10 ์›” 20 ์ผ 2:39 am, "Osaid Rehman Nasir" [email protected]
์ผ๋‹ค :

์ข‹์•„ ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์‹œ๊ฐ„์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๋บ„์…ˆ-์ œ๊ณฑ ๋ฐ float64๋กœ ๋ณ€ํ™˜ ํ•œ ๋‹ค์Œ ๊ณฑ-๋‹ค์Œ-ํ•ฉ
X์™€ Y๋ฅผ ๋งค์šฐ ํฐ ๋ฒกํ„ฐ๋กœ ์„ ํƒํ•˜๋ฉด 2
๊ฒฐ๊ณผ๋Š” ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋˜ํ•œ @jnothman https://github.com/jnothman
๋‹น์‹ ์€ ๋บ„์…ˆ์ด ์˜ณ์•˜๋‹ค-๊ทธ ๋‹ค์Œ ์ œ๊ณฑ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.
์ œ๊ฐ€ ์ž‘์„ฑํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”.

numpy๋ฅผ np๋กœ ๊ฐ€์ ธ ์˜ค๊ธฐ
์ˆ˜์ž… scipy
sklearn.metrics.pairwise import check_pairwise_arrays, row_norms์—์„œ
sklearn.utils.extmath์—์„œ ๊ฐ€์ ธ ์˜ค๊ธฐ safe_sparse_dot
timeit์—์„œ default_timer๋ฅผ ํƒ€์ด๋จธ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋ฒ”์œ„ (9)์—์žˆ๋Š” i์˜ ๊ฒฝ์šฐ :
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, :]

# product-then-sum์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐ ๋œ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ
๊ฑฐ๋ฆฌ = safe_sparse_dot (X, YT, density_output = True)
๊ฑฐ๋ฆฌ * = -2
๊ฑฐ๋ฆฌ + = XX
๊ฑฐ๋ฆฌ + = YY

ans1 = np.sqrt (๊ฑฐ๋ฆฌ)

์‹œ์ž‘ = ํƒ€์ด๋จธ ()
ans2 = np.sqrt (row_norms (XY, squared = True) [:, 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?

๊ทธ๋ž˜, ๋‚ด๊ฐ€ ๋ญ˜ํ•˜๊ธธ ๋ฐ”๋ผ ๋‹ˆ?

๋ณด๋‹ค ์•ˆ์ •์ ์ธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๊ณ 
ํ˜„์žฌ ๊ตฌํ˜„, ์ด์ƒ์ ์œผ๋กœ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์žƒ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฒค์น˜ ๋งˆํฌ
ํ•ฉ๋ฆฌ์ ์ธ ๊ฒฝ์šฐ์— ๋งŽ์€ ๋ณ€ํ™”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฒกํ„ฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ–‰ ์Œ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌป๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฒกํ„ฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ–‰ ์Œ ์‚ฌ์ด์˜ ์ฐจ์ด (๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹˜)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? numpy ๋ฐฐ์—ด๋กœ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ํ™•์‹คํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜•ํƒœ๊ฐ€์žˆ๋Š” ๋ฐฐ์—ด (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 ...

2017 ๋…„ 11 ์›” 5 ์ผ ์˜ค์ „ 5:27, "Osaid Rehman Nasir" [email protected]
์ผ๋‹ค :

๋˜ํ•œ ๋” ์•ˆ์ •์ ์ธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋Š”์ง€ ๋ฌป๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.
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
.

ํ•˜์ง€๋งŒ PR์„ ์—ด๋ฉด ์ •ํ™•ํ•˜๊ฒŒ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ข‹์•„,์ด ๊ธฐ๋Šฅ์˜ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์œผ๋กœ PR์„ ์—ด๊ฒ ์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ์€ 0.20 ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ž‘์—…์ž…๋‹ˆ๋‹ค. ๊ณ ๋ คํ•  ์ˆ˜์žˆ๋Š” ๋‹จ์ˆœ / ์ผ์‹œ์  ๊ฐœ์„  (์˜ˆ : ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋น„์šฉ์ด ๋“œ๋Š” ์ด๋ฒคํŠธ)์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

# 11271์—์„œ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜๊ณผ ๋ถ„์„์€ ํ™•์‹คํžˆ ๋งค์šฐ ๊ฐ€์น˜๊ฐ€ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ์ตœ์ ์˜ ์†”๋ฃจ์…˜์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋” ๋งŽ์€ ๋…ผ์˜๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, CPU ์œ ํ˜• ๋“ฑ์— ๋”ฐ๋ผ https://github.com/scikit-learn/scikit-learn/issues/11506 ์—์„œ ์ตœ์ ์˜ ๊ธ€๋กœ๋ฒŒ ์ž‘์—… ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ๋ณด๋ฅ˜ ์ค‘์ด๋ผ๋Š” ์‚ฌ์‹ค์— ๋Œ€ํ•ด ์šฐ๋ คํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์ˆ˜์ค€์˜ ์ฒญํ‚น์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ „์ฒด์˜ ๋ณต์žก์„ฑ์€ ์•ฝ๊ฐ„์˜ ์ œ์–ด IMO๋ฅผ ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด์ฉŒ๋ฉด ๊ทธ๊ฒƒ์€ ๋‚˜์ผ ๋ฟ์ด๊ณ , ์ด์ฐจ ์˜๊ฒฌ์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@jnothman @amueller @ogrisel ๋ฆด๋ฆฌ์Šค์—์„œ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐ

์•ˆ์ •์„ฑ์ด ํšจ์œจ์„ฑ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •์„ฑ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋„ ์ˆ˜์ •๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
ํšจ์œจ์„ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์กฐ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

working_memory์˜ ์ดˆ์ ์€ ํฐ ์ƒ˜ํ”Œ๋กœ ์‹ค๋ฃจ์—ฃ ๊ฐ™์€ ๊ฒƒ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.
ํฌ๊ธฐ๊ฐ€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํšจ์œจ์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์ง€๋งŒ
์„ .

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ euclidean_distances์— ๋Œ€ํ•œ ์ˆ˜์ •์„ ์‹œ๋„ํ•ด์•ผํ•œ๋‹ค๊ณ  ๊ฐ•๋ ฅํžˆ ๋ฏฟ์Šต๋‹ˆ๋‹ค.
float32 in. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ 0.19์—์„œ ๊นจ๋œจ ๋ ธ์Šต๋‹ˆ๋‹ค.
euclidean_distances๋Š” ์ˆœ์ง„ํ•œ ๋ฐฉ์‹์œผ๋กœ 32 ๋น„ํŠธ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” ํšจ์œจ์„ฑ์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ถ”๊ฐ€ ๋ณต์žก์„ฑ์ž…๋‹ˆ๋‹ค.

ํ•œ ๋ฐœ ๋ฌผ๋Ÿฌ์„œ์„œ scipy์˜ ์œ ํด๋ฆฌ๋“œ ๊ตฌํ˜„์€ 10 ์ค„์˜ C ์ฝ”๋“œ๋กœ ๋ณด์ด๋ฉฐ 32 ๋น„ํŠธ์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ 64 ๋น„ํŠธ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ€์žฅ ๋น ๋ฅด์ง€๋Š” ์•Š์ง€๋งŒ ๊ฐœ๋…์ ์œผ๋กœ ๋”ฐ๋ฅด๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. scikit-learn์—์„œ ์šฐ๋ฆฌ๋Š” ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ BLAS์—์„œ ๊ณ„์‚ฐ์„ ๋” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ ํ•œ ๋‹ค์Œ https://github.com/scikit-learn/scikit-learn/pull/10212 ๋ฐ ์ด์ œ ์œ ํด๋ฆฌ๋“œ์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ์ฒญํฌ ์†”๋ฃจ์…˜์œผ๋กœ ์ธํ•ด ๊ฐ€๋Šฅํ•œ ๊ฐœ์„ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 32 ๋น„ํŠธ์˜ ๊ฑฐ๋ฆฌ.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ๋ฐฉํ–ฅ์ด ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ์ผ๋ถ€๋ฅผ scipy๋กœ ์—…์ŠคํŠธ๋ฆผํ•˜๋ ค๊ณ  ์‹œ๋„).

scipy๋Š” ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PR ์ดํ›„ 0.21๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

์ฐจ๋‹จ๊ธฐ๋ฅผ ์ œ๊ฑฐ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

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

dot (x, x) ๋ฐ dot (y, y)๊ฐ€ catastrophic cancel ์ด๋ผ๊ณ  ์•Œ๋ ค์ง„ ๋•Œ๋ฌธ์— dot (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))

sklearn์€ ์—ฌ๊ธฐ์—์„œ sqrt (2)๊ฐ€ ์•„๋‹Œ 0์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ๋ฐ ๊ณต๋ถ„์‚ฐ์— ๋Œ€ํ•œ ์ˆ˜์น˜ ์  ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์†ํ™”ํ•˜๋Š” ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

Erich Schubert ๋ฐ Michael Gertz.
(๊ณต) ๋ถ„์‚ฐ์˜ ์ˆ˜์น˜ ์ ์œผ๋กœ ์•ˆ์ •์ ์ธ ๋ณ‘๋ ฌ ๊ณ„์‚ฐ.
์—์„œ : ๊ณผํ•™ ๋ฐ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ (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 (sum (power ()))๋กœ ๊ณ„์‚ฐํ•˜๊ณ  ๋‹จ์ผ ํŒจ์Šค์ด๋ฉฐ ํ•ฉ๋ฆฌ์ ์ธ ์ •๋ฐ€๋„๋ฅผ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์†์‹ค์€ ์ด๋ฏธ ์ œ๊ณฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, dot (x, x) ์ž์ฒด๊ฐ€ ์ด๋ฏธ ์ •๋ฐ€๋„๋ฅผ ์žƒ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@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.5 ๋ฐฐ ๋” ๋งŽ์Œ) ๋งคํŠธ๋ฆญ์Šค ํ–‰๋ ฌ ๊ณฑ์…ˆ์„ ์œ„ํ•ด ์ž˜ ์ตœ์ ํ™” ๋œ BLAS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ scikit-learn์˜ ์—ฌ๋Ÿฌ ์ถ”์ •์ž๋“ค์—๊ฒŒ ์—„์ฒญ๋‚œ ์†๋„ ์ €ํ•˜๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ,ํ•˜์ง€๋งŒ FP32์—์„œ๋Š” 3 ~ 4 ์ž๋ฆฌ ์ •๋ฐ€๋„ , FP64์—์„œ๋Š” 7 ~ 8 ์ž๋ฆฌ ์ˆซ์ž๋งŒ์œผ๋กœ๋„ ์ƒ๋‹นํ•œ ๋ถ€์ •ํ™•์„ฑ ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ํŠนํžˆ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ์ฆํญ๋˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ...

๊ธ€์Ž„์š”, ์ง€๊ธˆ์€ ๊ดœ์ฐฎ๋‹ค๋Š” ๋ง์ด ์•„๋‹™๋‹ˆ๋‹ค. :)
๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ์‚ฌ์ด์— ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•„์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด float64์—์„œ ์บ์ŠคํŠธํ•˜๋„๋ก ์ œ์•ˆํ•˜๋Š” PR (# 11271)์ด ์žˆ์Šต๋‹ˆ๋‹ค. In์€ float64์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ์•Š์ง€๋งŒ float32์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ์ •๋ฐ€๋„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

euclidean_distances๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์ •๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ฐ€๋„ ์†์‹ค๋กœ ์ธํ•ด ์ž˜๋ชป๋œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ด๊ฒƒ์ด ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ 0.21์„ ์ฐจ๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 0.19์—์„œ 32 ๋น„ํŠธ์— ๋Œ€ํ•ด ๋„์ž… ๋œ ๋ฌธ์ œ ์˜€๊ณ , ๋– ๋‚˜๊ธฐ์— ์ข‹์€ ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. 0.20์—์„œ ๋” ์ผ์ฐ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๊ณ , ์ค‘๊ฐ„์— # 11271์ด ํ•ฉ์ณ์ง€๋Š” ๊ฒƒ์„ ๋ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ PR์—์„œ ๋‚ด๊ฐ€ ์•„๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์˜ ์„œ๋ผ์šด๋“œ ์ตœ์ ํ™”์— ๋Œ€ํ•ด ์•„๋Š” ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ๊นŠ์€ ํ† ๋ผ ๊ตฌ๋ฉ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š”์ด "๋น ๋ฅธ"๋ฒ„์ „์„ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉํ•ด ์™”์ง€๋งŒ ํ•ญ์ƒ float64์ž…๋‹ˆ๋‹ค. @ kno10 , ์ •ํ™•์„ฑ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜์žˆ๋Š”์‹œ๊ธฐ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋” ๋Š๋ฆฌ์ง€ ๋งŒ ๋” ํ™•์‹คํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋น ๋ฅด๊ณ  ์ข‹์€ ํœด๋ฆฌ์Šคํ‹ฑ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ,ํ•˜์ง€๋งŒ FP32์—์„œ๋Š” 3 ~ 4 ์ž๋ฆฌ์˜ ์ •๋ฐ€๋„, FP64์—์„œ๋Š” 7 ~ 8 ์ž๋ฆฌ์˜ ์ •๋ฐ€๋„๋งŒ์œผ๋กœ๋„ ์ƒ๋‹นํ•œ ๋ถ€์ •ํ™•์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ์ด ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‚˜๋Š”์ด ๋ฌธ์ œ๊ฐ€ ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋„๋ฆฌ ํผ์ ธ ์žˆ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ๊ทธ๋“ค์˜ ๊ทœ๋ฒ”์— ๋น„ํ•ด ์ƒํ˜ธ ๊ฑฐ๋ฆฌ๊ฐ€ ์ž‘์€ ์ƒ˜ํ”Œ์— ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ ๊ฐ 1D ์ƒ˜ํ”Œ์ด [-100, 100] ๊ฐ„๊ฒฉ์—์žˆ๋Š” 2e6 ์ž„์˜ ์ƒ˜ํ”Œ ์Œ์— ๋Œ€ํ•ด์ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. scikit-learn๊ณผ scipy ๊ตฌํ˜„ ๊ฐ„์˜ ์ƒ๋Œ€ ์˜ค์ฐจ๋Š” L2 ํ‘œ์ค€์— ์˜ํ•ด ์ •๊ทœํ™” ๋œ ์ƒ˜ํ”Œ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ ํ•จ์ˆ˜๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

d_norm(A, B) = d(A, B) / sqrt(โ€–Aโ€–โ‚‚*โ€–Bโ€–โ‚‚)

(์˜ฌ๋ฐ”๋ฅธ ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™”์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐ์ดํ„ฐ ์Šค์ผ€์ผ์— ๋‹ค์†Œ ๋ถˆ๋ณ€ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด),
euclidean_distance_precision_1d

์˜ˆ๋ฅผ ๋“ค์–ด

  1. [10000] ๋ฐ [10001] ํ•˜๋Š” ๊ฒฝ์šฐ L2 ์ •๊ทœํ™” ๋œ ๊ฑฐ๋ฆฌ๋Š” 1e-4์ด๊ณ  ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์˜ ์ƒ๋Œ€ ์˜ค๋ฅ˜๋Š” 64 ๋น„ํŠธ์—์„œ 1e-8, 32 ๋น„ํŠธ์—์„œ> 1 (๋˜๋Š” 1e -8 ๋ฐ> 1). 32 ๋น„ํŠธ์—์„œ์ด ๊ฒฝ์šฐ๋Š” ์ฐธ์œผ๋กœ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฐ˜๋ฉด์— [1] ๋ฐ [10001] ์˜ ๊ฒฝ์šฐ ์ƒ๋Œ€ ์˜ค๋ฅ˜๋Š” 32 ๋น„ํŠธ์—์„œ ~ 1e-7 ๋˜๋Š” ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ •๋ฐ€๋„์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์‚ฌ๋ก€ 1์ด ์‹ค์ œ๋กœ ML ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋นˆ๋„์ž…๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‹ค์‹œ ๊ท ์ผ ํ•œ ๋ฌด์ž‘์œ„ ๋ถ„ํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 2D๋กœ ์ด๋™ํ•˜๋ฉด ๋งค์šฐ ๊ฐ€๊นŒ์šด ์ ์„ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
euclidean_distance_precision_2d

๋ฌผ๋ก  ์‹ค์ œ๋กœ ์šฐ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋Š” ๊ท ์ผํ•˜๊ฒŒ ์ƒ˜ํ”Œ๋ง๋˜์ง€ ์•Š์ง€๋งŒ ์ฐจ์›์˜ ์ €์ฃผ๋กœ ์ธํ•ด ์–ด๋–ค ๋ถ„ํฌ์— ๋Œ€ํ•ด์„œ๋„ ์ฐจ์›์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋‘ ์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฐ’ (0๊ณผ ๋‹ค๋ฆ„)์œผ๋กœ ์ฒœ์ฒœํžˆ ์ˆ˜๋ ด๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ML ๋ฌธ์ œ์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ์ฐจ์›์˜ ๊ฒฝ์šฐ์—๋„์ด ์ •ํ™•๋„ ๋ฌธ์ œ๋ฅผ ๋‹ค์†Œ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. n_features=5 ๋Œ€ํ•œ ๊ฒฐ๊ณผ ์•„๋ž˜,
euclidean_distance_precision_5d .

๋”ฐ๋ผ์„œ ์ค‘์•™ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ์ ์–ด๋„ 64 ๋น„ํŠธ์—์„œ๋Š” ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (2 ๊ฐœ ์ด์ƒ์˜ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •). 50 ๋ฐฐ์˜ ๊ณ„์‚ฐ ์†๋„ ํ–ฅ์ƒ (์œ„ ๊ทธ๋ฆผ ์ฐธ์กฐ)์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (64 ๋น„ํŠธ). ๋ฌผ๋ก  [-1, 1]์—์„œ ์ •๊ทœํ™” ๋œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ์— ํ•ญ์ƒ 1e6์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ์ •ํ™•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ์ˆ˜์น˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜๊ณ  6 ๋ฒˆ์งธ๋กœ ํ‘œํ˜„ ๋œ ๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ˆซ์ž๋Š” ๋ฌธ์ œ๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

(์œ„ ๊ทธ๋ฆผ์˜ ์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ ์—์„œ ์ฐพ์„ ์ˆ˜

dot (x, x) + dot (y, y) -2 dot (x, y) ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋น ๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹ ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด์ ์˜ ์ •๋ฐ€๋„๋ฅผ ๋‘ ๋ฐฐ๋กœ ๋Š˜๋ ค์•ผ ์•ฝ. ์˜ ์ •๋ฐ€๋„ (์‚ฌ์šฉ์ž๊ฐ€ float32 ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋ฉด float32 ์ •๋ฐ€๋„๋ฅผ ์›ํ•˜๊ณ  float64 ์ •๋ฐ€๋„๋ฅผ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค). ๋ช‡ ๊ฐ€์ง€ ํŠธ๋ฆญ (์นดํ•œ ํ•ฉ์‚ฐ์„ ์ƒ๊ฐํ•ด๋ณด์‹ญ์‹œ์˜ค)์œผ๋กœ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฒ˜์Œ์— ์–ป์€ ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๋น„์šฉ์ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด float32๋ฅผ float64๋กœ ์ฆ‰์‹œ ๋ณ€ํ™˜ ํ•  ๋•Œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์˜ค๋ฒ„ ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ float32์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚ด์ ์„ float64๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

IMHO, ์„ฑ๋Šฅ ํ–ฅ์ƒ (๊ธฐํ•˜ ๊ธ‰์ˆ˜์ ์ด์ง€ ์•Š๊ณ  ์ผ์ •ํ•œ ์š”์†Œ)์€ ์ •๋ฐ€๋„ ์†์‹ค (์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฌผ๋ฆด ์ˆ˜ ์žˆ์Œ)์˜ ๊ฐ€์น˜๊ฐ€ ์—†์œผ๋ฉฐ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€์ด ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด AVX๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด "์ „ํ†ต์ ์ธ"๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sum ((xy) * 2)์€ AVX์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.์ตœ์†Œํ•œ, ๊ฐ€๋” ๋‚ฎ์€ ์ •๋ฐ€๋„ ๋•Œ๋ฌธ์— ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ approximate_euclidean_distances ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค (๋‘ ๊ฐ’์ด ๊ฐ€๊นŒ์šธ์ˆ˜๋ก ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค. , ์‚ฌ์šฉ์ž๊ฐ€์ด ๋ฌธ์ œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rth ์‚ฝํ™”์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด x๋ฅผ ์ตœ์ ์œผ๋กœ ์ตœ์ ํ™”ํ•˜๋ ค๊ณ ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”? ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ตœ์  ๊ฐ’์€ 0์ด ์•„๋‹ ๊ฒƒ์ด๋ฉฐ (ํ•ญ์ƒ ๋ฐ์ดํ„ฐ ์„ผํ„ฐ๋ผ๋ฉด ์‚ถ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค), ๊ฒฐ๊ตญ ๊ทธ๋ผ๋””์–ธํŠธ ๋“ฑ์„ ์œ„ํ•ด ๊ณ„์‚ฐํ•˜๋Š” ๋ธํƒ€์—๋Š” ์•„์ฃผ ์ž‘์€ ์ฐจ์ด๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฐ์ง‘์—์„œ ๊ตฐ์ง‘์˜ ์ค‘์‹ฌ์ด ๋ชจ๋‘ 0์— ๊ฐ€๊นŒ์›Œ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ํŠนํžˆ ๊ตฐ์ง‘์ด ๋งŽ์€ ๊ฒฝ์šฐ x โ‰ˆ ์ค‘์‹ฌ์ด ๋ช‡ ์ž๋ฆฟ์ˆ˜๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ „๋ฐ˜์ ์œผ๋กœ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ํ˜„์žฌ ๊ตฌํ˜„์˜ ์ •๋ฐ€๋„ ๋ฌธ์ œ๋ฅผ ๋ฌธ์„œํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š”์ด ํ† ๋ก ์ด scikit-learn์—์„œ ์ผ์–ด๋‚˜์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋Š” ๋‹ค์–‘ํ•œ ๊ณผํ•™ ์ปดํ“จํŒ… ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ IMO scipy ๋ฉ”์ผ ๋ง๋ฆฌ์ŠคํŠธ ๋˜๋Š” ๋ฌธ์ œ๋Š” ํ† ๋ก ํ•˜๊ธฐ์— ๋” ์ข‹์€ ์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ์ด๋Ÿฌํ•œ ์ˆ˜์น˜ ์ •๋ฐ€๋„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ๋” ๋งŽ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์—์žˆ๋Š” ๊ฒƒ์€ ๋น ๋ฅด์ง€ ๋งŒ ๋‹ค์†Œ ๊ทผ์‚ฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋‹จ๊ธฐ๊ฐ„์— ๋ช‡ ๊ฐ€์ง€ ์ˆ˜์ • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์ด๊ฒƒ์ด ๊ธฐ์—ฌํ•  ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

32 ๋น„ํŠธ์˜ ๊ฒฝ์šฐ https://github.com/scikit-learn/scikit-learn/pull/11271 ์ด ์‹ค์ œ๋กœ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์ฒด์—์„œ ์—ฌ๋Ÿฌ ์ˆ˜์ค€์˜ ์ฒญํ‚น์„ ์ข‹์•„ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. , ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@ kno10์— ์‘๋‹ต ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! (์œ„์˜ ์˜๊ฒฌ์€ ์•„์ง ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.) ์ž ์‹œ ํ›„ ๋‹ต๋ณ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ์›์ ์„ ๋ฒ—์–ด๋‚œ ์ง€์ ์œผ๋กœ์˜ ์ˆ˜๋ ด์ด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IMHO, ์„ฑ๋Šฅ ํ–ฅ์ƒ (๊ธฐํ•˜ ๊ธ‰์ˆ˜์ ์ด์ง€ ์•Š๊ณ  ์ผ์ •ํ•œ ์š”์†Œ)์€ ์ •๋ฐ€๋„ ์†์‹ค (์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ๋ฌผ๋ฆด ์ˆ˜ ์žˆ์Œ)์˜ ๊ฐ€์น˜๊ฐ€ ์—†์œผ๋ฉฐ ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์€์ด ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

64 ๋น„ํŠธ์—์„œ ๊ณ„์‚ฐ ์†๋„๊ฐ€ 10 ๋ฐฐ ์ด์ƒ ๋Š๋ฆฌ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งค์šฐ ์‹ค์งˆ์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด AVX๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด "์ „ํ†ต์ ์ธ"๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€๋กœ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. sum ((xy) ** 2)๋Š” AVX์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

numba (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

์ง€๊ธˆ๊นŒ์ง€ scipy cdist ์™€ ๋น„์Šทํ•œ ์†๋„๋ฅผ ์–ป์—ˆ์œผ๋ฉฐ (ํ•˜์ง€๋งŒ ์ €๋Š” numba ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค) fastmath ์˜ ํšจ๊ณผ์— ๋Œ€ํ•ด์„œ๋„ ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

dot (x, x) + dot (y, y) -2 * dot (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๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. BLAS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์‹ค์ œ๋กœ ์œ„์˜ ์ฒซ ๋ฒˆ์งธ ๋ฒ„์ „๊ณผ ๋™์ผํ•œ ์ˆ˜์˜ ์ˆ˜ํ•™ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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/3 ๋น„์œจ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ๋…ผ์˜์— ๋”ฐ๋ผ

  • ์„ ํƒ์ ์œผ๋กœ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก PR์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/scikit-learn/scikit-learn/pull/12136
  • https://github.com/scikit-learn/scikit-learn/pull/12142 ์—์„œ ๋ฌธ์ œ ์ง€์ ์„ ๊ฐ์ง€ํ•˜๊ณ  ์™„ํ™” ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ์œ„ํ•œ ์ผ๋ถ€ WIP

32 ๋น„ํŠธ์˜ ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ IMO๋ฅผ ํ†ตํ•ด https://github.com/scikit-learn/scikit-learn/pull/11271 ์„ ์ผ๋ถ€ ํ˜•ํƒœ๋กœ ๋ณ‘ํ•ฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ PR์€ ์ด์™€ ๋‹ค์†Œ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  : OPTICS์˜ ์ผ๋ถ€ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ELKI์˜ ์ฐธ์กฐ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ƒˆ๋กœ ๊ณ ์น  ๋•Œ metric="euclidean" ์—์„œ๋Š” ์‹คํŒจํ•˜์ง€๋งŒ metric="minkowski" ์—์„œ๋Š” ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์น˜ ์ฐจ์ด๋Š” ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋ฅผ ์œ ๋ฐœํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํฝ๋‹ˆ๋‹ค (์ž„๊ณ„ ๊ฐ’์„ ์ค„์ด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Œ).

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

๋‚˜๋Š” ์ด๊ฒƒ์— ์ •๋ง๋กœ ์ต์ˆ™ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ธฐ์กด ์†”๋ฃจ์…˜์ด ์—†๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ณ„์‚ฐ์œผ๋กœ ๋ณด์ด๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”ํ€ด๋ฅผ ์žฌ๋ฐœ ๋ช…ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋” ๋„“์€ ๊ณผํ•™ ์ปดํ“จํŒ… ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์ ‘๊ทผ ํ•ด ๋ณธ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์•„์ง์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ๋ž˜์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. scipy์—์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ฐพ์€ ์œ ์ผํ•œ ๊ฒƒ์€ https://github.com/scipy/scipy/pull/2815 ๋ฐ ์—ฐ๊ฒฐ๋œ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.

@jeremiedbb ๊ฐ€ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๋ถˆํ–‰ํžˆ๋„ ์•„์ง ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค :(

OpenBLAS ๋˜๋Š” MKL๊ณผ ๊ฐ™์€ BLAS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„ ํ˜• ๋Œ€์ˆ˜์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๊ณ ๋„๋กœ ์ตœ์ ํ™” ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋„ํŠธ ํŠธ๋ฆญ์€ BLAS ๋ ˆ๋ฒจ 3 ํ–‰๋ ฌ-ํ–‰๋ ฌ ๊ณฑ์…ˆ ์„œ๋ธŒ ๋ฃจํ‹ด์— ์˜์กดํ•˜๋Š” ์‹œ๋„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ •ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์ •ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์†๋„ ๋‚˜ ์ •ํ™•์„ฑ ์ธก๋ฉด์—์„œ ๊ธฐ๋Œ€์น˜๋ฅผ ๋‚ฎ์ถฐ์•ผํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์ƒํ™ฉ์—์„œ๋Š” ์™„์ „ํ•œ ์ •๋ฐ€๋„๊ฐ€ ํ•„์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๊ฐ€ "๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ฐพ๊ธฐ"์ž‘์—…์— ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. fast ๋ฐฉ๋ฒ•์˜ ์ •๋ฐ€๋„ ๋ฌธ์ œ๋Š” ํฌ์ธํŠธ ๊ฐ„์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ํ‘œ์ค€์— ๋น„ํ•ด ์ž‘์„ ๋•Œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค (float 32์˜ ๊ฒฝ์šฐ ~ <1e-4, float64์˜ ๊ฒฝ์šฐ ~ <1e-8 ๋น„์œจ). ๋จผ์ € ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ๋งค์šฐ ์กฐ๋ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ˆœ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ ค๋ฉด ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฑฐ๋ฆฌ ๋‚ด์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‘ ์ ์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋”์šฑ์ด์ด ๊ฒฝ์šฐ ML ๊ด€์ ์—์„œ ๋‘˜ ๋‹ค ๊ฑฐ์˜ ๋˜‘๊ฐ™์ด ์ž˜ ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์ƒํ™ฉ์—์„œ ์ด๋Ÿฌํ•œ ์ž˜๋ชป๋œ ์ˆœ์„œ์˜ ๋นˆ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์ด ์žˆ์Šต๋‹ˆ๋‹ค (0?). ์Œ ๋‹จ์œ„ ๊ฑฐ๋ฆฌ argmin ์ƒํ™ฉ์—์„œ. ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง€์ ์ด ์•„๋‹Œ ์ง€์ ์œผ๋กœ ์˜ค ์ˆœ์„œ๋ฅผ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ํ‘œ์ค€ ์ค‘ ํ•˜๋‚˜๊ฐ€ argmin์„ ์ฐพ๋Š” ๋ฐ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์„ ์‚ฌ์šฉํ•˜์—ฌ comment๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๋‘ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๊ฐ•๋ ฅํ•˜๊ณ  (์ง€๊ธˆ๊นŒ์ง€ ์ž˜๋ชป๋œ ์ˆœ์„œ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค) ์ผ๋ถ€ ๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ๋‹จ์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋™์ผํ•œ ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง€์ ๊นŒ์ง€์˜ ์‹ค์ œ ๊ฑฐ๋ฆฌ๋ฅผ ์›ํ•˜๋ฉด ์œ„์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์‚ฐ ๋œ ๊ฑฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ€๋ถ„์ ์œผ๋กœ ๋งŒ ๊ณ„์‚ฐ๋˜๋ฉฐ ์–ด์จŒ๋“  ์ •ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ์ง€์ ์—์„œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ง€์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ฐ ํฌ์ธํŠธ์— ๋Œ€ํ•ด ๊ณ„์‚ฐํ•  ๊ฑฐ๋ฆฌ๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฆ…๋‹ˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์ด sklearn์—์„œ euclidean_distances์˜ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃจ๋Š” ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ ์šฉ๋  ์ˆ˜์žˆ๋Š” ๊ณณ์ด๋ฉด ์–ด๋””์—์„œ๋‚˜ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด euclidean_distances์— ์ƒˆ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ argmin๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ถ€๋ถ„ ๋งŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ pairwise_distances_argmin ๋ฐ pairwise_distances_argmin_min์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค (ํ›„์ž์˜ ๋์—์„œ ์‹ค์ œ ์ตœ์†Œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ).

๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์œผ๋ฉด ๋Š๋ฆฌ์ง€ ๋งŒ ์ •ํ™•ํ•œ ๊ฒƒ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฑฐ๋‚˜ # 12136๊ณผ ๊ฐ™์€ ์Šค์œ„์น˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ ์ตœ์ ํ™”๋ฅผ ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ตœ์ ์œผ๋กœ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

BLAS๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅ์„ฑ์€ axpy ์™€ nrm2 ๊ฒƒ์ด์ง€๋งŒ ์ด๋Š” ์ตœ์ ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค BLAS ๋ ˆ๋ฒจ 1 ๊ธฐ๋Šฅ์ด๋ฉฐ ์‚ฌ๋ณธ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฐจ์›> 100์—์„œ๋งŒ ๋” ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด์ƒ์ ์œผ๋กœ๋Š” ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๊ฐ€ BLAS์— ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์—… ์บ์ŠคํŒ…์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋˜ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ float32์˜ ๊ฒฝ์šฐ # 11271์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์žฅ์ ์€ ์†๋„๊ฐ€ ํ˜„์žฌ ์†๋„์˜ ์ ˆ๋ฐ˜์— ๋ถˆ๊ณผํ•˜๊ณ  ์ •๋ฐ€๋„๊ฐ€ ์œ ์ง€๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ float64์˜ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” float64์— ๋Œ€ํ•ด cython์—์„œ ๋น„์Šทํ•œ ์ผ์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ float128์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด 2 ๊ฐœ์˜ float64 ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋Š ์ •๋„ ๊ฐ€๋Šฅํ•œ์ง€๋ณด๊ธฐ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ์‹œ๋„ ํ•  ์ˆ˜์žˆ๋‹ค.

์ด์ƒ์ ์œผ๋กœ๋Š” ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๊ฐ€ BLAS์— ํฌํ•จ๋˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋„์„œ๊ด€์ด ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๊นŒ? OpenBLAS๊ฐ€ ๊ทธ๋ ‡๊ฒŒํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ฝค ์ข‹์€ ์ƒํ™ฉ์—์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ BLAS๊ฐ€ํ•˜๋Š” ๊ฒƒ์˜ ์ •ํ™•ํ•œ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? CPU ๊ธฐ๋Šฅ์„ ๊ฐ์ง€ํ•˜๊ณ  ์–ด๋–ค ๊ตฌํ˜„์„ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‹จ์ง€ ๋” ๋‹ค์–‘ํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์œ„ํ•ด ์ปดํŒŒ์ผ ๋œ ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?
์•„๋‹ˆ๋ฉด ํšจ์œจ์ ์ธ ๊ตฌํ˜„์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„ / ์—๋„ˆ์ง€๋ฅผ ์†Œ๋น„ํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ณ  ๋ถˆ์•ˆ์ •ํ•œ ๋ฐฉ๋ฒ•์˜ ๋Œ€์ฒด ๊ตฌํ˜„์ด์ง€๋งŒ sklearn๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.
https://github.com/droyed/eucl_dist
(์ด ๋ฌธ์ œ๋ฅผ ์ „ํ˜€ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.)

์ด ํ† ๋ก ์€ https://github.com/scipy/scipy/issues/5657 ๊ณผ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

Julia๊ฐ€ํ•˜๋Š” ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค : https://github.com/JuliaStats/Distances.jl/blob/master/README.md#precision -for-euclidean-and-sqeuclidean
์žฌ ๊ณ„์‚ฐ์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ฐ€๋„ ์ž„๊ณ„ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ : OpenBLAS์—๋Š” ๊ฐ ํ”„๋กœ์„ธ์„œ (์•„ํ‚คํ…์ฒ˜๊ฐ€ ์•„๋‹˜)์— ๋Œ€ํ•ด ์†์œผ๋กœ ์ž‘์„ฑํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ํฌ๊ธฐ์— ๋งž๋Š” ์ปค๋„์„ ์„ ํƒํ•˜๋Š” ํœดํ‹ฐ ์Šคํ‹ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์ปค๋„์„ ์ž‘์„ฑ / ์ตœ์ ํ™” ํ•  ์‚ฌ๋žŒ์„ ์ฐพ๋Š” ๊ฒƒ๋งŒ ํผ openblas์— ๋“ค์–ด๊ฐ€๋Š” ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋ถ€๋ถ„ ์‘๋‹ต์—์„œ

OpenBLAS ๋˜๋Š” MKL๊ณผ ๊ฐ™์€ BLAS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„ ํ˜• ๋Œ€์ˆ˜์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๊ณ ๋„๋กœ ์ตœ์ ํ™” ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋„ค, BLAS์—์„œ ๋” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ๋ฒˆ์— ํ‘œ์ค€ BLAS API์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๋ณด์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ถฉ๋ถ„ํžˆ ๊ฐ€๊น๊ฒŒ ๋ณด์˜€์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ๋‚˜๋Š” ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค). BLIS ๋Š” ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์†Œ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (numpy๋Š” ์–ธ์  ๊ฐ€ https://github.com/numpy/numpy/issues/7372)

Julia๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ •๋ฐ€ ์ž„๊ณ„ ๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ๊ฐ•์ œ๋กœ ์žฌ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ์•„๋‘๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค!

์œ„์— ๋งํฌ ๋œ ๋” ๋น ๋ฅธ ๊ทผ์‚ฌ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๋ณ„๋„์˜ ๋ฌธ์ œ๋ฅผ ์—ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ํฅ๋ฏธ ๋กญ๋‹ค

x2-x4์˜ CPU ์†๋„ ํ–ฅ์ƒ์€ https://github.com/scikit-learn/scikit-learn/pull/10212 ๋•Œ๋ฌธ์ผ ์ˆ˜

๋‚˜๋Š” ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๊ฐ€ ML ์™ธ๋ถ€์˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•  ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ฉ๋ฆฌ์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์„ ์ˆ˜์žˆ์„๋งŒํผ ์ถฉ๋ถ„ํžˆ์ด ์งˆ๋ฌธ์„ ์—ฐ๊ตฌ ํ•œ ํ›„์— scipy์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  ๋™์‹œ์— ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์ •ํ™•์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์ตœ๋Œ€ 60 ๋ฐฐ์ฃ ?

์ด๊ฒƒ์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅด๊ณ  ๋ถˆ์•ˆ์ •ํ•œ ๋ฐฉ๋ฒ•์˜ ๋Œ€์ฒด ๊ตฌํ˜„์ด์ง€๋งŒ sklearn๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ scipy์˜ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” %timeit pairwise_distances(a,b, 'sqeuclidean') ๋ฒค์น˜๋งˆํ‚นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ %timeit pairwise_distances(a,b, 'euclidean', metric_params={'squared': True}) ์„ํ•ด์•ผํ•˜๊ณ  ์†๋„ ํ–ฅ์ƒ์€ ์ข‹์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. :)
๋…ผ์˜์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด sklearn์€ scipy๋ณด๋‹ค 35 ๋ฐฐ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, ๋ฒค์น˜ ๋งˆํฌ๋Š” metric="euclidean" ( squeclidean ๋Œ€์‹ )์—์„œ 30 % ๋งŒ ๋” ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

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๊ฐ€ ๊ทธ๋ ‡๊ฒŒํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ๊ฝค ์ข‹์€ ์ƒํ™ฉ์—์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ...

๊ฐ„๋‹จํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. BLAS๋Š” ์„ ํ˜• ๋Œ€์ˆ˜ ๋ฃจํ‹ด์— ๋Œ€ํ•œ ์ผ๋ จ์˜ ์‚ฌ์–‘์ด๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ ์‚ฌ์–‘์—์—†๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๊ฐœ๋ฐฉ์ ์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด blis๊ฐ€ ๋” ์—ด๋ ค์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „์— ๋งํ–ˆ๋“ฏ์ด ์ง€๊ธˆ์€ ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹™๋‹ˆ๋‹ค.

sqeuclidean ๋Œ€ euclidean ์ฒ˜๋ฆฌ์—์„œ pairwise_distances ์—์„œ https://github.com/scikit-learn/scikit-learn/issues/12600 ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์œ„ํ•ด ์›ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ๋ช…ํ™•์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. pairwise_distances ๊ฐ€ '์œ ํด๋ฆฌ๋“œ'์™€ 'sqeuclidean'๋ชจ๋‘์— ๋Œ€ํ•ด all_close ์˜ ์˜๋ฏธ์—์„œ ๊ฐ€๊น๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๊นŒ?

์•ฝ๊ฐ„ ๊นŒ๋‹ค ๋กญ์Šต๋‹ˆ๋‹ค. x๊ฐ€ y์— ๊ฐ€๊น๋‹ค๊ณ ํ•ด์„œ xยฒ๊ฐ€ yยฒ์— ๊ฐ€๊น๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ œ๊ณฑํ•˜๋Š” ๋™์•ˆ ์ •๋ฐ€๋„๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

์œ„์— ๋งํฌ ๋œ ์ค„๋ฆฌ์•„ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ํฅ๋ฏธ๋กญ๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 'sqeuclidean'์— ๋Œ€ํ•ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ์ •๋ฐ€๋„๋ฅผ ์–ป์œผ๋ ค๋ฉด ์•„๋ž˜ ์ž„๊ณ„ ๊ฐ’์„ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งค์šฐ ๋‚ฎ์€ ์ž„๊ณ„ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋งŽ์€ ์žฌ๊ณ„ ์‚ฐ๊ณผ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ฐจ์›์— ์˜ํ•ด ์™„ํ™”๋ฉ๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ž„๊ณ„ ๊ฐ’์€ ๋†’์€ ์ฐจ์›์—์„œ ๋” ์ ์€ ์žฌ ๊ณ„์‚ฐ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค (๊ฑฐ๋ฆฌ๊ฐ€ ๋” ํผ).

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ๊ตฌํ˜„์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ์ฐจ์›์— ๋”ฐ๋ผ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ฎ์€ ์ฐจ์›์˜ ๊ฒฝ์šฐ ๋Š๋ฆฌ์ง€ ๋งŒ ์•ˆ์ „ํ•œ ๊ฒƒ (์–ด์จŒ๋“  scipy์™€ sklearn ์‚ฌ์ด์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์Œ)๊ณผ ๋†’์€ ์ฐจ์›์˜ ๊ฒฝ์šฐ ๋น ๋ฅธ + ์ž„๊ณ„ ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ „ํ™˜์‹œ๊ธฐ๋ฅผ ์ฐพ๊ณ  ์ž„๊ณ„ ๊ฐ’์„ ์„ค์ •ํ•˜๋ ค๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋ฒค์น˜ ๋งˆํฌ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ํฌ๋ง์ด ํฌ๋ฏธํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋‹ค์Œ์€ scipy์™€ sklearn์˜ ์†๋„ ๋น„๊ต๋ฅผ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฒค์น˜ ๋งˆํฌ์ž…๋‹ˆ๋‹ค. ๋ฒค์น˜ ๋งˆํฌ๋Š” ๋ชจ๋“  ํฌ๊ธฐ์˜ X์— ๋Œ€ํ•ด sklearn.metrics.pairwise.euclidean_distances(X,X) ์™€ scipy.spatial.distance.cdist(X,X) ๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ƒ˜ํ”Œ ์ˆ˜๋Š” 2โด (16)์—์„œ 2ยนยณ (8192)๋กœ, ๊ธฐ๋Šฅ ์ˆ˜๋Š” 2โฐ (1)์—์„œ 2ยนยณ (8192)๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์…€์˜ ๊ฐ’์€ sklearn ๋Œ€ scipy์˜ ์†๋„ ํ–ฅ์ƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, 1 ๋ฏธ๋งŒ์˜ sklearn์€ ๋Š๋ฆฌ๊ณ  1 ์ด์ƒ์˜ sklearn์€ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ๋ฒค์น˜ ๋งˆํฌ๋Š” BLAS์˜ MKL ๊ตฌํ˜„๊ณผ ๋‹จ์ผ ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
bench_euclidean_mkl_1

๋‘ ๋ฒˆ์งธ๋Š” BLAS์˜ OpenBLAS ๊ตฌํ˜„๊ณผ ๋‹จ์ผ ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. MKL๊ณผ OpenBLAS์˜ ๋™์ž‘์ด ๋™์ผํ•œ ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
bench_euclidean_openblas_1

์„ธ ๋ฒˆ์งธ๋Š” BLAS ๋ฐ 4 ์ฝ”์–ด์˜ MKL ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” euclidean_distances ๋Š” BLAS LEVEL 3 ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ‘๋ ฌํ™”๋˜์ง€๋งŒ cdist ๋Š” BLAS LEVEL 1 ํ•จ์ˆ˜ ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๊ทธ๊ฒƒ์€ ๊ฑฐ์˜ ๊ตญ๊ฒฝ์„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
bench_euclidean_mkl_4

n_samples๊ฐ€ ๋„ˆ๋ฌด ๋‚ฎ์ง€ ์•Š์€ ๊ฒฝ์šฐ (> 100), ๊ฒฝ๊ณ„๋Š” ์•ฝ 32 ๊ฐœ ํ”ผ์ฒ˜ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. n_features <32 ์ผ ๋•Œ cdist๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  n_features> 32 ์ผ ๋•Œ euclidean_distances๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋” ๋น ๋ฅด๊ณ  ์ •๋ฐ€๋„ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ n_features๊ฐ€ ์ž‘์„ ๋•Œ julia ์ž„๊ณ„ ๊ฐ’์ด ๋งŽ์€ ์žฌ ๊ณ„์‚ฐ์œผ๋กœ ์ด์–ด์ง„๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. cdist๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๊ฒƒ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

n_features> 32 ์ธ ๊ฒฝ์šฐ ์ค„๋ฆฌ์•„ ์ž„๊ณ„ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋œ euclidean_distances ๊ตฌํ˜„์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž„๊ณ„ ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ ํ•ด์„œ euclidean_distances ๋„ˆ๋ฌด ๋Š๋ ค์ง€์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์ˆ˜๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋†’์•„์„œ ๋ช‡ ๋ฒˆ์˜ ์žฌ๊ณ„ ์‚ฐ๋งŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@jeremiedbb ์ข‹์•„์š”,

์˜ค, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ชจ๋‘ float64๋ฅผ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. float32๋กœ ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ? ํ•ญ์ƒ ๊ธฐ๋ถ„ ๋‚˜์œ๊ฐ€์š”? 32 ๊ฐœ ์ด์ƒ์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ?

๋‚˜๋Š” ์ฃผ์„์„์ฃผ์˜ ๊นŠ๊ฒŒ ์ฝ์ง€ ์•Š์•˜๋‹ค (๊ณง ์˜ˆ์ •), float64์— ์ œํ•œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. # 12128์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@ qinhanmin2014 ์˜ˆ, float64 ์ •๋ฐ€๋„์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์ง€๋งŒ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์‹ ๋ขฐํ•  ์ˆ˜์žˆ๋Š” fp32 ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” fp64๋กœ ์—… ์บ์ŠคํŠธํ•˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ scipy์˜ cdist๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ €๋ ดํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์œ„์˜ ๋ฒค์น˜ ๋งˆํฌ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๋ฉ€ํ‹ฐ ์ฝ”์–ด BLAS์กฐ์ฐจ๋„ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋น ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์ด๊ฒƒ์€ ์ฃผ๋กœ ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ (64 ์ฐจ์› ์ด์ƒ, ๊ทธ ์ „์—๋Š” ์ด์ ์ด IMHO์˜ ๊ฐ€์น˜๊ฐ€ ์—†์Œ)์— ์ ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋Š” ๊ณ ๋ฐ€๋„ ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์—์„œ ๊ทธ๋‹ค์ง€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— IMHO ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธก์ • ๊ธฐ์ค€์ด 10 ๊ฐœ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ cdist๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋น ๋ฅธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค, ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ชจ๋‘ float64๋ฅผ์œ„ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ float32์™€ float64 ๋ชจ๋‘์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค (๋งค์šฐ ๋น„์Šทํ•˜๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค). n_features <32 ์ผ ๋•Œ ํ•ญ์ƒ cdist๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” fp64๋กœ ์—… ์บ์ŠคํŠธํ•˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ scipy์˜ cdist๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ €๋ ดํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—… ์บ์ŠคํŒ…์€ ~ 2 ๋ฐฐ๋กœ ๋Š๋ ค์ง€๋ฏ€๋กœ n_features = 64 ์ •๋„๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธก์ • ๊ธฐ์ค€์ด 10 ๊ฐœ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

@jeremiedbb ์•„์ฃผ ์ข‹์€ ๋ถ„์„!

์ € ์ฐจ์› ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ cdist๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ™•์‹คํžˆ ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ FYI scipy์˜ cdist๋Š” float32๋ฅผ float64๋กœ ์—… ์บ์ŠคํŠธ https://github.com/scipy/scipy/issues/8771#issuecomment -384015674, ์ด๊ฒƒ์ด ์ •ํ™•์„ฑ ๋ฌธ์ œ ๋˜๋Š” ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ธํ•œ ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ https://github.com/scikit-learn/scikit-learn/pull/12601#pullrequestreview -176076355์—์„œ ์ œ์•ˆํ•œ๋Œ€๋กœ euclidean_distance "algorithm"๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ "None"์ด๋ฏ€๋กœ https://github.com/scikit-learn/scikit-learn/pull/12136 ์—์„œ์™€ ๊ฐ™์ด ์ „์—ญ ์˜ต์…˜์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค

Eigen3์—๋Š” ์•ˆ์ •์ ์ธ ํ‘œ์ค€์„ ๊ณ„์‚ฐํ•˜๋Š” ํฅ๋ฏธ๋กœ์šด ์ ‘๊ทผ ๋ฐฉ์‹๋„ ์žˆ์Šต๋‹ˆ๋‹ค. https://eigen.tuxfamily.org/dox/StableNorm_8h_source.html

์ข‹์€ ์„ค๋ช…, ์ดํ•ด๋„ ํ–ฅ์ƒ

์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ฆฐํŠธ์—์„œ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ค ์ง„์ „๋„ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์•˜๊ณ  ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ... ๊ทธ๋ฆฌ๊ณ  @rth ๋Š” ์˜ค๋Š˜ ์ฃผ๋ณ€์— ์—†์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„์„ ์„ค์ •ํ•˜๋ฉด ์›๊ฒฉ์œผ๋กœ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜คํ›„ ์ดˆ์—?

์ƒํ™ฉ์„ ์š”์•ฝํ•˜๋ฉด

์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์˜ ์ •๋ฐ€๋„ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ

  • ์ € ์ฐจ์›์˜ ๊ฒฝ์šฐ @jeremiedbb ๊ฐ€ ์œ„์—์„œ ๋ณด์—ฌ์ค€ ๊ฒƒ์ฒ˜๋Ÿผ ์•„๋งˆ๋„ cdist๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ์ฐจ์› ์ผ€์ด์Šค์™€ float32์—์„œ ๋‹ค์Œ ์ค‘์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ฒญํ‚น, 64 ๋น„ํŠธ๋กœ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ๋ฐ ์—ฐ๊ฒฐ

    • ์ •๋ฐ€๋„๊ฐ€ ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ cdist๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค (๊ณต๊ฐœ ์งˆ๋ฌธ์€ ์–ด๋–ป๊ฒŒ๋ฉ๋‹ˆ๊นŒ-์˜ˆ๋ฅผ ๋“ค์–ด scipy์— ๋ฌธ์˜ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. )

๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ ํด๋ฆฌ๋“œ, sqeuclidean, minkowski ๋“ฑ์˜ ๋ชจ๋“  ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ฐ€๋„ ์ธก๋ฉด์—์„œ @jeremiedbb , @amueller ๋ฐ ๋‚˜๋Š” ๋น ๋ฅธ ๋Œ€ํ™”๋ฅผ

๊ทธ๋ž˜์„œ ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ float32์— ๋Œ€ํ•œ ์—… ์บ์ŠคํŒ…์— ๋Œ€ํ•œ @rth ์˜ ์ด์ „ ์ฝ”๋ฉ˜ํŠธ์— ๋งŒ์กฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. cdist๋„ float64๋กœ ์—… ์บ์ŠคํŠธํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” cdist๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜์—ฌ float32 (๊ทธ๋Ÿฌ๋‚˜ float64 ๋ˆ„์‚ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?)๋ฅผ ์ทจํ•˜๊ฑฐ๋‚˜, ๋‚ฎ์€ ํฌ๋ฏธํ•œ float32์—์„œ ๋ณต์‚ฌ๋ฅผ ์ค„์ด๋ ค๋ฉด ์ฒญํ‚น์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@Celelibi ๊ฐ€ # 11271์—์„œ PR์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด sqeuclidean ๋ฐ minkowski (p in {0,1})๊ฐ€ ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋„๋กํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. NearestNeighbors์™€์˜ ๋ถˆ์ผ์น˜๋ฅผ ๋…ผ์˜ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์Šคํ”„๋ฆฐํŠธ :)

์Šคํ”„๋ฆฐํŠธ์—์„œ ๋น ๋ฅธ ํ† ๋ก  ํ›„ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

  • ๋†’์€ ์ฐจ์›์˜ ๊ฒฝ์šฐ (> 32 ๋˜๋Š”> 64๊ฐ€ ์ตœ์„ ์„ ์„ ํƒ) : float32 ์ผ ๋•Œ ๋ฉ์–ด๋ฆฌ๋ณ„๋กœ float64๋กœ ์—… ์บ์ŠคํŠธํ•˜๊ณ  'fast'๋ฉ”์„œ๋“œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ float64์˜ ์ˆ˜์น˜ ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ทธ์— ๋Œ€ํ•œ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค).

  • ์ € ์ฐจ์›์˜ ๊ฒฝ์šฐ : sklearn์—์„œ (์—… ์บ์ŠคํŠธ ๋•Œ๋ฌธ์— scipy cdist๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ) ์•ˆ์ „ํ•œ ๊ณ„์‚ฐ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

(Upcasting float32๋ฅผ 0.20.3์œผ๋กœ ๋˜์ง€๋Š” ๊ฒƒ๋„ ์œ ํ˜น์ ์ž…๋‹ˆ๋‹ค)

๋‹ค์Œ์€ scipy์™€ sklearn์˜ ์†๋„ ๋น„๊ต๋ฅผ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฒค์น˜ ๋งˆํฌ์ž…๋‹ˆ๋‹ค.
[... ์‹น๋‘‘ ...]

์ด๊ฒƒ์€ ๋งค์šฐ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ œ๋กœ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ ํ•œ ๊ฒฐ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋” ๋‚ฎ์€ ๊ฒฐ์ • ๊ฒฝ๊ณ„๋ฅผ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ . ๋‚ด ๋ฒค์น˜ ๋งˆํฌ๋Š” 8 ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

heatmap

์ž˜๋ชป๋˜๋Š” ๋น„์šฉ์€ ๋Œ€์นญ์ด ์•„๋‹™๋‹ˆ๋‹ค. cdist ๋Š” ๊ณ„์‚ฐ์ด ๋ช‡ ์ดˆ ๋ฏธ๋งŒ์œผ๋กœ ์ง€์†๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋” ์ข‹์œผ๋ฉฐ ๊ธฐ๋Šฅ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด ์ •๋ง ๋น ๋ฅด๊ฒŒ ๋Š๋ ค์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜์‹ฌ์Šค๋Ÿฌ์šด ๊ฒฝ์šฐ BLAS ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ :์ด ๋ฒค์น˜ ๋งˆํฌ๋Š” float64์— ๋Œ€ํ•œ ๊ฒƒ์ด์—ˆ์ง€๋งŒ, float64๋กœ ์—… ์บ์ŠคํŒ…ํ•˜๋Š” float32 ํ–‰๋ ฌ์€ ์ด ์‹œ๊ฐ„์— ๋ช‡ ํผ์„ผํŠธ ๋งŒ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ฒฐ๋ก ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ž„๊ณ„ ๊ฐ’์€ ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์‹คํ–‰์ค‘์ธ ์ปดํ“จํ„ฐ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. AVX ์ง€์นจ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ฐœํ‘œ ํ•œ ๋ฒค์น˜ ๋งˆํฌ๊ฐ€ AVX2 ๋ช…๋ น์ด์—†๊ณ  AVX ๋งŒ์žˆ๋Š” ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  AVX2๊ฐ€์žˆ๋Š” ์ปดํ“จํ„ฐ์—์„œ ๋‹น์‹ ๊ณผ ๋น„์Šทํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋Š” ์„ฑ๋Šฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ •๋ฐ€๋„์— ๊ด€ํ•œ ๊ฒƒ์ด๋ฉฐ ์น˜์ˆ˜๊ฐ€ ์ž‘์„ ๋•Œ ์ •๋ฐ€๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ํฝ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ 16์€ ์ข‹์€ ํƒ€ํ˜‘์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด ?

์ด ๋…ผ์˜์™€ ๊ด€๋ จํ•˜์—ฌ ์ •๋ณด์— ์ž…๊ฐ ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋ ค๋ฉด ์ •ํ™•์„ฑ์„ ๋ฒค์น˜๋งˆํ‚นํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ PR๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ •ํ™•๋„๋Š” ๋” ์ด์ƒ ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•ฝ๊ฐ„ ๋” ๋น„์‹ผ ๊ณ„์‚ฐ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž„๊ณ„ ๊ฐ’์€ PR์„ ๋ฒค์น˜๋งˆํ‚นํ•˜์—ฌ ๊ฒฐ์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฒค์น˜๋งˆํ‚น ์ •ํ™•๋„๋Š” ๊ทธ๋ ‡๊ฒŒ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด๋ ค์šด ๊ฒฝ์šฐ๋Š” ๊ท ์ผํ•˜๊ฒŒ ๋ถ„๋ฐฐ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ฝ”๋„ˆ ์ผ€์ด์Šค์—์„œ ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ฉ๋ฆฌ์ ์ธ CPU ํ•œ๋„ ๋‚ด์—์„œ ์ˆ˜์น˜ ์ •ํ™•๋„๋ฅผ ๋ณด์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด 10000000.01 ๋ฐ 10000000.00์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹จ์ผ ๊ธฐ๋Šฅ์€ ์•Œ๋ ค์ง„ ๋ฌธ์ œ ๋ฐฉ์ •์‹, fp32์™€ ํ•จ๊ป˜ 10000 ๋ฐ 10001์„ ์‚ฌ์šฉํ•  ๋•Œ fp64์—์„œ ์ˆซ์ž ๋ถˆ์•ˆ์ •์„ฑ์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 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์€์ด ํŠน์ • ๊ฒฝ์šฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, float64 + ๋†’์€ ์ฐจ์›.

๊ทธ๋Ÿฌ๋‚˜ float32์— ๋Œ€ํ•ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” float64 + high dim์˜ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜์—†๊ณ  ๊ธฐ๊ณ„ ํ•™์Šต ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์‹ค์ œ๋กœ ์ ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜ˆ์—์„œ X [0] ๋ฐ X [1]์€ 320000.32 ๋ฐ 320000๊ณผ ๊ฐ™์€ ๊ทœ๋ฒ”์„ ๊ฐ€์ง€๋ฉฐ ๊ฑฐ๋ฆฌ๋Š” 0.32, ์ฆ‰ ๊ทœ๋ฒ”์˜ 1e-6 ๋ฐฐ์ž…๋‹ˆ๋‹ค. ๊ธฐ๊ณ„ ํ•™์Šต์—์„œ 16 ๊ฐœ์˜ ์œ ํšจ ์ˆซ์ž (float64)๊ฐ€ ๋ชจ๋‘ ๊ด€๋ จ์ด์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” float64 + high dim์˜ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •ํ™•๋„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜์—†๊ณ  ๊ธฐ๊ณ„ ํ•™์Šต ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์‹ค์ œ๋กœ ์ ์šฉ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์˜จ๊ฑด ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐจ์›์„ ์ค„์ด๋Š” ๊ฒƒ์€ ML์˜ ์ผ๋ฐ˜์ ์ธ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด MDS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ ํ–‰๋ ฌ์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ float64 ์ผ€์ด์Šค์˜ ์ •ํ™•๋„๋ฅผ ๊ฐœ์„ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€ ๋‚ด๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ๋ถ€๋™ ์†Œ์ˆ˜์ ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด scikit-learn์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ.
ftp://ftp.math.ethz.ch/users/wpp/CELL/qd.pdf

๋‚˜๋Š” ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๊ณ„ ํ•™์Šต์— ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง์€ ์•„๋‹™๋‹ˆ๋‹ค. float64์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ •๋ฐ€๋„ ๋ฌธ์ œ์˜ ์ข…๋ฅ˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ํ‘œ์ค€๋ณด๋‹ค 6 ๋ฐฐ ๋” ์ž‘์€ ์ง€์ ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ฐ€๋„๋Š” ํ˜„์‹ค์ ์ธ ๊ธฐ๊ณ„ ํ•™์Šต ๋ชจ๋ธ์—์„œ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ธฐ๊ณ„ ํ•™์Šต์—์„œ 16 ๊ฐœ์˜ ์œ ํšจ ์ˆซ์ž (float64)๊ฐ€ ๋ชจ๋‘ ๊ด€๋ จ์ด์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ „ํ˜€ ํ™•์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” 16 ์ž๋ฆฌ ์ค‘ 15 ์ž๋ฆฌ์˜ ์ •๋ฐ€๋„๋ฅผ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. ์ •๋ฐ€๋„์˜ ์ ˆ๋ฐ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์˜ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ๊ด€๊ณ„๋Š” ์—†์Šต๋‹ˆ๋‹ค. FP64์—์„œ FP32 ๋กœ์˜ ๋‹ค์šด ์บ์ŠคํŒ… ์†์‹ค์€ ์ธก์ • ์ •๋ฐ€๋„๋กœ ์ธํ•ด ํ—ˆ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์†Œ๋น„์ž ์šฉ GPU๋Š” FP64๋ณด๋‹ค FP32์—์„œ ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ๋ชจ๋“  ๊ณณ์— ์ ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด k- ํ‰๊ท  ๊ตฐ์ง‘ํ™”์—์„œ๋Š” ๊ตฐ์ง‘์˜ ํ‰๊ท ์ด ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฐ€์ • ์ด ์žˆ์œผ๋ฉฐ (์‚ฌ์ „์— ํ‰๊ท ์„ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ) ์—ฌ๊ธฐ์„œ ์ •๋ฐ€๋„๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ์ผ๋ถ€ ๊ทœ๋ฒ”์€ ๋ถ„๋ฆฌ์— ๋น„ํ•ด ํด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ์ฒซ ๋ฒˆ์งธ ์ดˆ๊ธฐ ๋ฐ˜๋ณต ํ›„์— ํ•œ ์ง€์ ์ด ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „ํ™˜๋˜๋Š” ๊ฑฐ๋ฆฌ์˜ ์ž‘์€ ์ฐจ์ด๊ฐ€ ์ข…์ข… ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ •๋ฐ€๋„๊ฐ€ ๋–จ์–ด์ง€๋ฉด ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ œ ๋งŽ์€ ๋ณ€์ˆ˜๊ฐ€์žˆ๋Š” ์‹œ๊ณ„์—ด ์กฐ๊ฐ์— ๋Œ€ํ•œ k- ํ‰๊ท ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์ž‘์•„ ์ง„๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผํ•˜๋ฉฐ, ํ‘œ์ค€์ด 0์ด ์•„๋‹ˆ๋ฉด ๊ฒฐ๊ตญ ๋ฒกํ„ฐ ํ‘œ์ค€๋ณด๋‹ค ์ž‘์•„ ์ ธ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์„ธํŠธ ํฌ๊ธฐ๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ๋”์šฑ ์‹ฌ๊ฐํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฐจ์›์˜ ์ €์ฃผ์— ๋”ฐ๋ฅด๋ฉด ๊ฐ€์žฅ ํฐ ๊ฑฐ๋ฆฌ์™€ ๊ฐ€์žฅ ์ž‘์€ ๊ฑฐ๋ฆฌ๋Š” ์ ์  ๋” ๋น„์Šทํ•ด์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ •ํ™•ํ•œ ์ตœ๊ทผ ์ ‘ ์ด์›ƒ ์ˆœ์œ„๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ์—์„œ ์šฐ์ˆ˜ํ•œ ์ •๋ฐ€๋„๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 20news ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ 0์ด ์•„๋‹Œ ๊ฐ€์žฅ ์ž‘์€ ๊ฑฐ๋ฆฌ๋Š” ์•ฝ 0.02์ž…๋‹ˆ๋‹ค (ํ‘œ์ค€์€ ๋ชจ๋‘ 1 ์ž„). ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ 10,000 ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค์ด๋ฉฐ ์ƒ๋‹นํžˆ ๋‹ค์–‘ํ•œ ์ฝ˜ํ…์ธ ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ๊ฑฐ์˜ ์ค‘๋ณต ๊ฐ์ง€์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ML์—์„œ ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด์—†๋Š” ์ผ์ด๋ผ๊ณ  ํ™•์‹  ํ•  ์ˆ˜ ์—†๋‹ค. ๋ฌผ๋ก  ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ด๋‹ค.

"๋จธ์‹  ๋Ÿฌ๋‹์—์„œ 16 ๊ฐœ์˜ ์œ ํšจ ์ˆซ์ž (float64)๋Š” ๋ชจ๋‘ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•˜๋ฉด ๊ณ„์‚ฐ ๋œ ๊ฑฐ๋ฆฌ๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ X๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ธฐ๊ณ„ ํ•™์Šต์—์„œ ๋ฐ์ดํ„ฐ๋Š” ์ธก์ • ๊ฐ’์—์„œ ๋น„๋กฏ๋˜๋ฉฐ 9 ๋ฒˆ์งธ ์ž๋ฆฌ๊นŒ์ง€ ์ •ํ™•ํ•œ ์ธก์ • ๊ฐ’์€ ์—†์Šต๋‹ˆ๋‹ค (์ž…์ž ๋ฌผ๋ฆฌํ•™์—์„œ๋Š” ๋งค์šฐ ์ ์€ ์ธก์ • ๊ฐ’ ์ œ์™ธ).
๋”ฐ๋ผ์„œ 10000000.01 ๋ฐ 10000000.00 ์˜ ์˜ˆ์—์„œ X ๊ฐ’์— ๋Œ€ํ•œ ๋ถˆํ™•์‹ค์„ฑ์ด ํ›จ์”ฌ ํด ๋•Œ 0.01 ๊ฑฐ๋ฆฌ๋ฅผ ์–ด๋–ป๊ฒŒ ์ค‘์š”์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

KMeans์˜ ๊ฒฝ์šฐ ๋จผ์ € ์ •๋ฐ€๋„ ์†์‹ค์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ๊ทน๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์ธก์น˜ x์˜ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ค‘์‹ฌ์„ ์ฐพ์„ ๋•Œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์น˜๋ช…์ ์ธ ์ทจ์†Œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์— x์˜ ํ‘œ์ค€์„ ์ถ”๊ฐ€ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ kmeans ๊ตฐ์ง‘์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์ธ์ง€๋Š” ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋  ํ™•๋ฅ ์€ 0์ž…๋‹ˆ๋‹ค. Kmeans๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฐ์ง‘ ๋  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ถ”์ •์น˜๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ๋‘ ๊ตฐ์ง‘์˜ ๊ฒฝ๊ณ„์—์žˆ๋Š” ์ ์€ ํ™•์‹คํžˆ ์–ด๋Š ํ•˜๋‚˜์— ์†ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‘ ๊ตฐ์ง‘์˜ ๊ฐ™์€ ๊ฑฐ๋ฆฌ์—์žˆ๋Š” ์ ์— ๋Œ€ํ•œ ๋‹น์‹ ์˜ ํ•ด์„์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚ด ๋ฐ์ดํ„ฐ๋Š” 2 ๊ฐœ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ ์—ฌ์•ผํ•˜๊ฑฐ๋‚˜ KMeans๊ฐ€ ๋‚ด ๋ฐ์ดํ„ฐ๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋งํ•˜๋Š” ๋ฐ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹™๋‹ˆ๋‹ค (๋˜๋Š” kmeans์กฐ์ฐจ๋„ ๋‚ด ๋ฐ์ดํ„ฐ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ๋ง๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค์†Œ ์ข‹์€ ์•„์ด๋””์–ด๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ๊ณ„๋Š” ๊ด€๋ จ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค).

"| b | ^ 2-2ab"๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์น˜๋ช…์ ์ธ ์ทจ์†Œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ์ˆซ์ž์˜ ์ •๋ฐ€๋„ ์†์‹ค์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‚˜์ค‘์— ๊ฐ ๊ฑฐ๋ฆฌ์— a์˜ ํ‘œ์ค€์„ ์ถ”๊ฐ€ ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๊ฐ€ a์˜ ํ‘œ์ค€๋ณด๋‹ค ํ›จ์”ฌ ์ž‘ ์œผ๋ฉด BLAS ํ•ดํ‚น์—†์ด ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ์ •๋ฐ€๋„ ์†์‹ค์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ˆ˜์น˜ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณต ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

K- ํ‰๊ท ์€ ์ตœ์ ํ™” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋Ÿฌํ•œ ํ•ดํ‚น์€ sklearn์ด ๋‹ค๋ฅธ ๋„๊ตฌ๋ณด๋‹ค ๋” ๋‚˜์œ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ๊ฒƒ์„ ์˜๋ฏธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ๋˜ํ•œ ๋ถˆ์•ˆ์ •์„ฑ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ, ์ด๊ฒƒ์€ sklearn kmeans๊ฐ€ ๊ฐœ์„ ์—†์ด max_iter ๊นŒ์ง€ ๋™์ผํ•œ ์ƒํƒœ๋ฅผ ๋ฐ˜๋ณตํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋กœ์ปฌ ์ตœ์  ๊ฐ’์„ ์ฐพ์œผ๋ ค๋ฉด tol = 0 ๊ฐ€์ •). ์ด๋ก ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค.
k- ํ‰๊ท ์ด ์ˆ˜๋ ด ๋  ๋•Œ๊นŒ์ง€ ๋‘ ๊ตฐ์ง‘์— ๋Œ€ํ•ด "๋™์ผํ•œ"๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ€์ง„ ์ ์— ๋Œ€ํ•ด ๋งŽ์€ ๊ฒƒ์„ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฐ˜๋ณต์—์„œ๋Š” ํ‰๊ท ์ด ์ด๋™ํ–ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ์ฐจ์ด๋Š” ํ›จ์”ฌ ๋” ์ปค์ง€๊ณ  ์ค‘์š”ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!
๋‚˜๋Š” k- ํ‰๊ท ์ด ์žก์Œ์ด ๋งŽ์€ ๋ฐ์ดํ„ฐ์—์„œ ๋„ˆ๋ฌด ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ด๋ ฌํ•œ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋” ์ž˜ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ณ€ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋งˆ๋„ ์™„์ „ํ•œ ํ’ˆ์งˆ์„ ์–ป์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ด๊ฒƒ์ด ํ•ญ์ƒ tol=0 ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค). ์ ์ ˆํ•œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋ฐ์ดํ„ฐ ํฌ๊ธฐ์— ๋”ฐ๋ผ ๋ฌธ์ œ๊ฐ€ ์•…ํ™”๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ๋Š๋ฆฐ ๋Ÿฐํƒ€์ž„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ ํฐ ๋ฐ์ดํ„ฐ ์„ธํŠธ์˜ ๊ฒฝ์šฐ ์ •๋ฐ€๋„๊ฐ€ ๋” ์ค‘์š”ํ•ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค).

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋”ฐ๋ผ 10000000.01 ์™€ 10000000.00 ๊ฐ€ ์ค‘์š”

์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ‰๊ท ์€ ์žƒ๊ณ  ์‹ถ์ง€ ์•Š์€ ๋ฌผ๋ฆฌ์  ์˜๋ฏธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜จ๋„๊ฐ€ ์ผˆ๋นˆ ๋‹จ์œ„ ์ธ ๋ฐ์ดํ„ฐ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ 0 : 1์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜ ์ค‘์•™์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์˜ ๋น„์œจ ์ฒ™๋„๋ฅผ ๋ง์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ผ๋ถ€ ์ฒ ๊ฐ• ์ œํ’ˆ์ด ๋ƒ‰๊ฐ ๋  ๋•Œ ์˜จ๋„์˜ ์‹œ๊ณ„์—ด์„ ๋น„๊ตํ•˜๊ณ  ๋ƒ‰๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ ๊ฐ• ์ œํ’ˆ์˜ ์‹ ๋ขฐ์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด. ์˜จ๋„๊ฐ€ 700K ์ด์ƒ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ƒ‰๊ฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ถ„์„ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์‹œ๊ณ„์—ด์— ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ณ„์—ด ๊ธธ์ด์™€ ํ•จ๊ป˜ 5 ์ž๋ฆฌ์˜ ์ž…๋ ฅ ์ •๋ฐ€๋„ (0.01K)๋งŒ์œผ๋กœ๋„ ์ˆซ์ž ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์—์„œ ๋‹ค์‹œ 1-2 ์ž๋ฆฌ ์ˆซ์ž๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์น˜๋ช…์ ์ธ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด ML์—์„œ ์ •๋ฐ€๋„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์ œ ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 16 ์ž๋ฆฌ ์ˆซ์ž ์ค‘ 10 ์ž๋ฆฌ ์ •๋ฐ€๋„๋ฅผ ํ•ญ์ƒ ํ™•๋ณด ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” 0 ์ž๋ฆฌ ์ˆซ์ž๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด๊ฒƒ์ด ์žฌ์•™์ ์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค).

๊ธฐ๊ณ„ ํ•™์Šต์—์„œ ๋ฐ์ดํ„ฐ๋Š” ์ธก์ • ๊ฐ’์—์„œ ๋น„๋กฏ๋˜๋ฉฐ 9 ๋ฒˆ์งธ ์ž๋ฆฌ๊นŒ์ง€ ์ •ํ™•ํ•œ ์ธก์ • ๊ฐ’์€ ์—†์Šต๋‹ˆ๋‹ค (์ž…์ž ๋ฌผ๋ฆฌํ•™์—์„œ๋Š” ๋งค์šฐ ์ ์€ ์ธก์ • ๊ฐ’ ์ œ์™ธ).

ํ˜„์‹ค ์„ธ๊ณ„์˜ ์›์‹œ ๊ฐ’์€ ๊ทธ๋Ÿฐ ์ •ํ™•๋„๋ฅผ ๊ฑฐ์˜ ๊ฐ–์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ML์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ž…๋ ฅ์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฃจ๋น…์Šค ํ๋ธŒ์™€ ๊ฐ™์€ ํผ์ฆ์˜ ๊ทธ๋ž˜ํ”„์— MDS๋ฅผ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ํŒฉ๋งจ์„ ํ”Œ๋ ˆ์ดํ•˜๋Š” RL ์—์ด์ „ํŠธ ๋ฌด๋ฆฌ๊ฐ€ ์ฐพ์€ ์„ฑ๊ณต์ ์ธ ์ „๋žต์„ ํด๋Ÿฌ์Šคํ„ฐ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ˆ˜ํ•™ ๋ฌธ์ œ์— ML์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ •๋ณด์˜ ์ดˆ๊ธฐ ์†Œ์Šค๊ฐ€ ์‹ค์ œ ์„ธ๊ณ„์ธ ๊ฒฝ์šฐ์—๋„ ๋Œ€๋ถ€๋ถ„์˜ ์ˆซ์ž๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ด€๋ จ์‹œํ‚ค๋Š” ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ ์„ธ๊ณ„์—์„œ ํ†ต๊ณ„์ ์œผ๋กœ ์ƒ˜ํ”Œ๋ง ๋œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฝ์‚ฌ ํ•˜๊ฐ• ๋ฒ•์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์™œ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ ์ด๊ฒƒ์„ ๋…ผ์˜ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘ scikit-learn์ด ๊ณ„์‚ฐ ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ ˆ์ถฉ ์ •ํ™•๋„์—์„œ ์ตœ์„ ์„ ๋‹คํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์ƒํƒœ์— ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ์€ ํ’€ ์š”์ฒญ์„ ์ œ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

"| b | ^ 2-2ab"๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์น˜๋ช…์ ์ธ ์ทจ์†Œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ์ฐจ์ด๋ฅผ ๋งŒ๋“œ๋Š” ์ˆซ์ž์˜ ์ •๋ฐ€๋„ ์†์‹ค์€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ๋‚˜์ค‘์— ๊ฐ ๊ฑฐ๋ฆฌ์— a์˜ ํ‘œ์ค€์„ ์ถ”๊ฐ€ ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๊ฐ€ a์˜ ํ‘œ์ค€๋ณด๋‹ค ํ›จ์”ฌ ์ž‘ ์œผ๋ฉด BLAS ํ•ดํ‚น์—†์ด ๊ธฐ์กด ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ์ •๋ฐ€๋„ ์†์‹ค์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์‹ค์ œ๋กœ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ˆ˜์น˜ ๋ฌธ์ œ๋ฅผ ๊ทน๋ณต ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค!

์ •๋ฐ€๋„๋Š” ๋–จ์–ด์ง€์ง€ ๋งŒ ์น˜๋ช…์ ์ธ ์ทจ์†Œ (์ ์–ด๋„ a์™€ b๊ฐ€ ๊ฐ€๊นŒ์šธ ๋•Œ)๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ฑฐ๋ฆฌ (๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹˜)์— ๋Œ€ํ•œ ์ƒ๋Œ€ ์˜ค์ฐจ๊ฐ€ ์ž‘๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ค‘์‹ฌ์„ ์ฐพ๋Š” ๋ฐ์—๋งŒ ๊ด€์‹ฌ์ด์žˆ๋Š” KMeans์˜ ๊ฒฝ์šฐ ์ˆœ์„œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์œ ์ง€ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ฐ€๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์— ๊ด€์„ฑ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ •ํ™•ํ•œ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์ ์—์„œ ํด๋Ÿฌ์Šคํ„ฐ ์ค‘์‹ฌ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ KMeans๋Š” ๋ณผ๋ก ์ตœ์ ํ™” ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ˆ˜๋ ด ๋  ๋•Œ๊นŒ์ง€ tol = 0์œผ๋กœ ์‹คํ–‰ํ•˜๋”๋ผ๋„ ์ „์—ญ ์ตœ์†Œ๊ฐ’์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ์žˆ์„ ์ˆ˜์žˆ๋Š” ๋กœ์ปฌ ์ตœ์†Œ๊ฐ’์ด๋ฉ๋‹ˆ๋‹ค (kmeans ++ ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„). ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹ค๋ฅธ init๊ณผ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ ์€ ์ˆ˜์˜ ๋ฐ˜๋ณต์œผ๋กœ kmeans๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๋กœ์ปฌ ์ตœ์†Œ๊ฐ’์œผ๋กœ ๋๋‚  ์ˆ˜์žˆ๋Š” ๋” ๋‚˜์€ ๊ธฐํšŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ˆ˜๋ ด ๋  ๋•Œ๊นŒ์ง€ ๊ฐ€์žฅ ์ข‹์€ ๊ฒƒ์„ ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ๊ฑฐ๋ฆฌ์™€ ๋น„๊ต ํ•œ ์ƒ๋Œ€ ์˜ค์ฐจ๋Š” ์ž„์˜์ ์œผ๋กœ ํด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž˜๋ชป๋œ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ด์›ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด tf-idf์—์„œ | a | ยฒ = | b | ยฒ = 1 ์ธ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋ฒกํ„ฐ๊ฐ€ ๋งค์šฐ ๊ฐ€๊น๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ab๋„ 1์— ๊ฐ€๊นŒ์šฐ๋ฉฐ์ด ์‹œ์ ์—์„œ ์ด๋ฏธ ๋งŽ์€ ์ •๋ฐ€๋„๋ฅผ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค.
์œ„์—์„œ ์ผ ๋“ฏ์ด ์น˜๋ช…์ ์ธ ์ทจ์†Œ๊ฐ€ ์—†๋”๋ผ๋„ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 8 ์ž๋ฆฌ ์ •๋ฐ€๋„๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์‹ค์ œ ๊ฑฐ๋ฆฌ๋Š” 0.000012345678 ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ FP32 ๋ฐ ์ผ๋ฐ˜ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 8 ์ž๋ฆฌ ์ˆซ์ž๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜์ด ๋ฐฉ์ •์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Œ€์‹  ab = 0.99998765432 ๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. FP32๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๊ปํ•ด์•ผ ์•ฝ 0.99998765๋กœ ์ž˜ ๋ฆฌ๋ฏ€๋กœ์ด ์˜ˆ์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์„ธ ์ž๋ฆฌ์˜ ์ •๋ฐ€๋„๋ฅผ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค. ์†์‹ค์€ ์žฌ์•™์ ์ธ ๊ฒฝ์šฐ๋งŒํผ ํฝ๋‹ˆ๋‹ค. ๊ฑฐ๋ฆฌ๊ฐ€ ํ‘œ์ค€๋ณด๋‹ค ํ›จ์”ฌ ์ž‘ ์œผ๋ฉด์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ฐ€๋„๊ฐ€ ์ž„์˜๋กœ ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ, kmeans๋Š” ๋ณผ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ตœ์†Œํ•œ ๋กœ์ปฌ ์ตœ์ ์„ ์ฐพ๊ณ  ์ •๋ฐ€๋„๊ฐ€ ๋„ˆ๋ฌด ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉˆ์ถค (๋˜๋Š” ๊ฒฐ๊ณผ ์˜ค๋ฅ˜๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง„๋™)ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ทธ๋ž˜์„œ ์ ์–ด๋„ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์—ฌ๋Ÿฌ ์‹œ๋„์™€ ์„ธ๊ณ„๋ฅผ ์ฐพ์„ ์ˆ˜์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์–ป์„.

์ด ํ† ๋ก ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์—๊ฒŒ ์ •๋ง๋กœ ํ•„์š”ํ•œ ๊ฒƒ์€ float64์— ๋Œ€ํ•œ ์—… ์บ์ŠคํŠธ๋ฅผ ์ค‘๋‹จํ•˜๊ธฐ ์ „์—ํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š์€ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ @Celelibi ์˜ ์—… ์บ์ŠคํŒ… ์†”๋ฃจ์…˜์œผ๋กœ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ฎ์€ ์ฐจ์›์—์„œ ์ •ํ™•ํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด์ „์— ์ˆ˜ํ–‰ํ•˜๋˜ ์ž‘์—…์ด ์ถ”๊ฐ€๋กœ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

ํ–ฅํ›„ ๋ฒ„์ „๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋†’์€ ์ฐจ์›์—์„œ ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์„ ๊ณ ๋ คํ•  ๋•Œ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ง€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ž์‹ ๊ฐ์ด ๋” ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚œ์ˆ˜๋กœ float64 ์ผ€์ด์Šค์˜ ํ‰๊ท  ์ •ํ™•๋„๋ฅผ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฒค์น˜ ๋งˆํฌ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. 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 ๋ฐ Y ์˜ 10000 ์Œ์˜ ๋ฒกํ„ฐ ์ค‘ ํ•˜๋‚˜ ์‚ฌ์ด์˜ ์ œ๊ณฑ ๋œ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ์˜ ์ƒ๋Œ€ ์˜ค์ฐจ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ์ƒ๋Œ€ ์˜ค์ฐจ์— 2 ^ 53์„ ๊ณฑํ•˜๋ฉฐ, ์ด๋Š” ๋Œ€๋žต ULP ๋‹จ์œ„์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
์œ„์˜ ๊ณก์„ ์€ ๊ทผ์‚ฌ ๋ถ„ํฌ์ž…๋‹ˆ๋‹ค (์ปค๋„ ๋ฐ€๋„ ์ถ”์ •๊ฐ’ ์‚ฌ์šฉ).

float64_relerr

๊ทธ๋ž˜ํ”„๋Š” ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด 6 ULP๋กœ ์ž˜ ๋ ธ์Šต๋‹ˆ๋‹ค. ๋” ๋‚˜์œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ ํ‰๊ท  ์‚ฌ๋ก€๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ™•์žฅ ๋œ ์ˆ˜์‹์˜ ์˜ค๋ฅ˜๋Š” ์ƒ๋‹นํžˆ ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋‚˜์˜ ๋ถ„์„์€ ํ‰๊ท ์ ์œผ๋กœ ํ™•์žฅ ๋œ ๊ณต์‹์˜ ์ƒ๋Œ€์  ์˜ค์ฐจ๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน์ง•์œผ๋กœ ๋งค์šฐ ํด ์ˆ˜ ์žˆ์ง€๋งŒ ๋น ๋ฅด๊ฒŒ ์ฐจ์ด์™€ numpy ํ•ฉ๊ณ„์˜ ์˜ค์ฐจ์™€ ๋น„์Šทํ•ด์ง‘๋‹ˆ๋‹ค. ์ž„๊ณ„ ๊ฐ’์€ 5 ~ 10 ๊ฐœ ๊ธฐ๋Šฅ ์‚ฌ์ด์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ํ˜„์žฌ ๋ณ‘๋ฆฌํ•™์ ์ธ ์˜ˆ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ™•์žฅ ๋œ ๊ณต์‹์˜ ์˜ค๋ฅ˜์— ๋Œ€ํ•œ ์ƒํ•œ์„ ์„ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ kno10 ์˜ ์šฐ๋ ค๋Š” ์ข…์ข… ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ ์ด ๋ฌด์ž‘์œ„๋กœ ๋ถ„ํฌ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ์„œ๋กœ ๊ฐ€๊น๊ฑฐ๋‚˜ ๋‹จ์œ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ‘œ์ค€.

์‚ฌ์‹ค,ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ, ๊ทธ๊ฒƒ์€ ์™„์ „ํ•œ BS ์•„๋‹ˆ๋ผ๊ณ  ํ™•์‹  ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ^^

์œ„์˜ ์„ค๋ช…์„ ์™„๋ฃŒํ•˜๋ ค๋ฉด ์ˆ˜์‹ 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

ULP์˜ ํžˆ์Šคํ† ๊ทธ๋žจ ํ”Œ๋กฏ์ด ULP ๋‚ด ์˜ค๋ฅ˜ ๋ถ„ํฌ๊ฐ€์žˆ๋Š” ์œ„์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 0 ULP ์˜ค๋ฅ˜์™€ 1 ULP ์˜ค๋ฅ˜๋Š” "๊ฐ€๋“ํ•œ๋Œ€๋กœ"์ž…๋‹ˆ๋‹ค. 2 ULP๋Š” sqrt ๋•Œ๋ฌธ์— ํ”ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋” ํฐ ์˜ค๋ฅ˜๋Š” ์กฐ์‚ฌ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ๊ฐ’์ด ํฌ๋ฉด (computed - exact) / exact ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•ํ•œ ๊ฐ’์— ๋Œ€ํ•œ ์ˆ˜์น˜ ์  ๋„์ „์„ ๋ฐ›์œผ๋ฉด ์ด๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ถˆ์•ˆ์ • ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ (computed-exact)/norm ๋Œ€์‹  ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŒŒ์ƒ ๋œ ๊ฑฐ๋ฆฌ์™€ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ๋น„๊ต ํ•œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์˜ ์ •๋ฐ€๋„๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
1 ULP ๋งŒ ๋‹ค๋ฅธ 2 ๊ฐœ์˜ 1 ์ฐจ์› ๊ฐ’์ด ์žˆ๊ณ  2 ULP์˜ ์˜ค๋ฅ˜๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํ•ด์ƒ๋„์— ์žˆ์œผ๋ฏ€๋กœ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ๋‹นํžˆ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ ์ฐจ์›์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์—์„œ ๋” ๋†’์€ ํ•ด์ƒ๋„๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(1, 1e-16) ๋Œ€ (1, 2e-16) ์œ ํ˜•์˜ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ์ƒ์ˆ˜ ์†์„ฑ์ด์žˆ๋Š” ๊ฒฝ์šฐ (์˜ˆ : MNIST์˜ ํฐ์ƒ‰ ํ”ฝ์…€).
์ฐจ์ด ๊ธฐ๋ฐ˜ ๋ฐฉ์ •์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ดœ์ฐฎ์ง€ ๋งŒ ๋„ํŠธ ๋ฒ„์ „์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 1 ์ฐจ์› ์‹คํ—˜์œผ๋กœ๋Š” ์ด๊ฒƒ์„ ์—ฐ๊ตฌํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ULP์˜ ํžˆ์Šคํ† ๊ทธ๋žจ ํ”Œ๋กฏ์ด ULP ๋‚ด ์˜ค๋ฅ˜ ๋ถ„ํฌ๊ฐ€์žˆ๋Š” ์œ„์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜๋ณด๋‹ค ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ์ˆ˜ ๋ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‹น ํ•˜๋‚˜์˜ ํžˆ์Šคํ† ๊ทธ๋žจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 3D ํ”Œ๋กฏ์ด๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์™ธ์—๋Š” ํ•  ์ˆ˜์žˆ๋Š” ์ผ์ด๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค.

์ •ํ™•ํ•œ ๊ฐ’์ด ํฌ๋ฉด (computed - exact) / exact ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ •ํ™•ํ•œ ๊ฐ’์— ๋Œ€ํ•œ ์ˆ˜์น˜ ์  ๋„์ „์„ ๋ฐ›์œผ๋ฉด ์ด๊ฒƒ์€ ์ƒ๋‹นํžˆ ๋ถˆ์•ˆ์ • ํ•ด์ง‘๋‹ˆ๋‹ค.

์ด ๋งฅ๋ฝ์—์„œ ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๊ฐ’์€ ์ •ํ™•ํžˆ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
(๋งํ•˜์ž๋ฉด, ์ •ํ™•ํžˆ ๋ฐ˜์˜ฌ๋ฆผ ๋œ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•˜๋Š” ๋Œ€์‹  ๋‚ด ํ”Œ๋กฏ์—์„œ๋„ ์ž„์˜์˜ ์ •๋ฐ€๋„๋กœ ์ƒ๋Œ€ ์˜ค์ฐจ๋ฅผ ๊ณ„์‚ฐํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋กฏ์„ ์—…๋ฐ์ดํŠธํ–ˆ๋Š”๋ฐ ์ด์ƒํ•œ ํŒŒ๋„๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.)

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ (computed-exact)/norm ๋Œ€์‹  ์‚ฌ์šฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํŒŒ์ƒ ๋œ ๊ฑฐ๋ฆฌ์™€ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ๋น„๊ต ํ•œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ์˜ ์ •๋ฐ€๋„๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹น์‹ ์˜ ์•„์ด๋””์–ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ๋‹ค๋ฉด ์ ˆ๋Œ€ ์˜ค์ฐจ๋ฅผ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ฒกํ„ฐ ๋…ธ๋ฆ„์„ ์ž…๋ ฅ ํฌ๊ธฐ์˜ ์ง‘๊ณ„ ์ฒ™๋„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ์ƒ๋Œ€ ์˜ค์ฐจ๋Š” ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ์˜ ํฌ๊ธฐ์™€ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ”ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ฒฐํ•จ ์ด

  • ๊ฒฐ๊ณผ์˜ ๋ช‡ ์ž๋ฆฟ์ˆ˜๊ฐ€ ์ •ํ™•ํ•˜์ง€ ์•Š์€์ง€๋Š” ์‹ค์ œ๋กœ ๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‹ค์ œ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ ์ˆ˜๋Š” 1e-15 ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค. ํ™•์žฅ ๋œ ๊ณต์‹ (์  ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜)์กฐ์ฐจ๋„ 5 ULP (์ž…๋ ฅ) (๋Œ€๋žต ์ถ”์ •, ์™„์ „ํ•œ ์ฆ๋ช…์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์Œ)์™€ ๊ฐ™์€ ์ ์ˆ˜๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋‘ ์ธก์ • ํ•ญ๋ชฉ ๋ชจ๋‘ ์ ˆ๋Œ€ ์˜ค๋ฅ˜ computed - exact ์˜ ์žฌ์กฐ์ • ๋œ ๋ฒ„์ „์ด๋ฏ€๋กœ ๋™์ผํ•œ ์ž…๋ ฅ์— ๋Œ€ํ•ด ํ‰๊ฐ€ํ•  ๋•Œ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆœ์œ„๋ฅผ ๋งค ๊น๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ๊ฐ’ ํ•ด์„์ด ๋œ ์œ ์šฉํ•˜๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ์ƒ๋Œ€ ์˜ค์ฐจ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค (IMO).

(1, 1e-16) ๋Œ€ (1, 2e-16) ์œ ํ˜•์˜ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์— ์ƒ์ˆ˜ ์†์„ฑ์ด์žˆ๋Š” ๊ฒฝ์šฐ (์˜ˆ : MNIST์˜ ํฐ์ƒ‰ ํ”ฝ์…€).
์ฐจ์ด ๊ธฐ๋ฐ˜ ๋ฐฉ์ •์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ดœ์ฐฎ์ง€ ๋งŒ ๋„ํŠธ ๋ฒ„์ „์ด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— 1 ์ฐจ์› ์‹คํ—˜์œผ๋กœ๋Š” ์ด๊ฒƒ์„ ์—ฐ๊ตฌํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์  ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ƒ๋Œ€ ์˜ค๋ฅ˜๋Š” 1 . ์ด๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋งŒํผ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์˜ ์ˆซ์ž๊ฐ€ ์ •ํ™•ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ธก์ • ํ•ญ๋ชฉ์˜ ๊ฐ’์€ 1e-16 ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฒกํ„ฐ ํ‘œ์ค€์˜ ์ฒ™๋„์— ๋น„ํ•ด 16 ๋ฒˆ์งธ ์ˆซ์ž ๋งŒ ๊บผ์ ธ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ด ์˜ˆ์—์„œ ๋ฌด์—‡์„ ๋ณด์—ฌ ์ฃผ๋ ค๋Š” ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์—ฌ์ „ํžˆ float64๋ฅผ ์‚ฌ์šฉํ•œ euclidean_distances์˜ ์ •๋ฐ€๋„์— ๋Œ€ํ•ด ์šฐ๋ คํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์—ฌ๊ธฐ์— 100 ๊ฐœ์˜ ์ฃผ์„์ด ์žˆ์œผ๋ฏ€๋กœ์ด ํ† ๋ก ์„ ์ƒˆ๋กœ์šด ๋ฌธ์ œ์— ์š”์•ฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰