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')
ํ์ด์ฌ 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
๊ฑฐ๋ฆฌ + = YYans1 = 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โโ)
(์ฌ๋ฐ๋ฅธ ๋งค๊ฐ ๋ณ์ํ์ธ์ง ํ์คํ์ง ์์ง๋ง ๋ฐ์ดํฐ ์ค์ผ์ผ์ ๋ค์ ๋ถ๋ณํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด),
์๋ฅผ ๋ค์ด
[10000]
๋ฐ [10001]
ํ๋ ๊ฒฝ์ฐ L2 ์ ๊ทํ ๋ ๊ฑฐ๋ฆฌ๋ 1e-4์ด๊ณ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ์๋ ์ค๋ฅ๋ 64 ๋นํธ์์ 1e-8, 32 ๋นํธ์์> 1 (๋๋ 1e -8 ๋ฐ> 1). 32 ๋นํธ์์์ด ๊ฒฝ์ฐ๋ ์ฐธ์ผ๋ก ๋์ฐํฉ๋๋ค.[1]
๋ฐ [10001]
์ ๊ฒฝ์ฐ ์๋ ์ค๋ฅ๋ 32 ๋นํธ์์ ~ 1e-7 ๋๋ ๊ฐ๋ฅํ ์ต๋ ์ ๋ฐ๋์
๋๋ค.๋ฌธ์ ๋ ์ฌ๋ก 1์ด ์ค์ ๋ก ML ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ๋น๋์ ๋๋ค.
ํฅ๋ฏธ๋กญ๊ฒ๋ ๋ค์ ๊ท ์ผ ํ ๋ฌด์์ ๋ถํฌ๋ฅผ ์ฌ์ฉํ์ฌ 2D๋ก ์ด๋ํ๋ฉด ๋งค์ฐ ๊ฐ๊น์ด ์ ์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
๋ฌผ๋ก ์ค์ ๋ก ์ฐ๋ฆฌ์ ๋ฐ์ดํฐ๋ ๊ท ์ผํ๊ฒ ์ํ๋ง๋์ง ์์ง๋ง ์ฐจ์์ ์ ์ฃผ๋ก ์ธํด ์ด๋ค ๋ถํฌ์ ๋ํด์๋ ์ฐจ์์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ๋งค์ฐ ์ ์ฌํ ๊ฐ (0๊ณผ ๋ค๋ฆ)์ผ๋ก ์ฒ์ฒํ ์๋ ด๋ฉ๋๋ค. ์ผ๋ฐ์ ์ธ ML ๋ฌธ์ ์ด์ง๋ง ์ฌ๊ธฐ์๋ ์๋์ ์ผ๋ก ๋ฎ์ ์ฐจ์์ ๊ฒฝ์ฐ์๋์ด ์ ํ๋ ๋ฌธ์ ๋ฅผ ๋ค์ ์ํ ํ ์ ์์ต๋๋ค. n_features=5
๋ํ ๊ฒฐ๊ณผ ์๋,
.
๋ฐ๋ผ์ ์ค์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ์ ์ด๋ 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 ๋น์จ์ด ์์ต๋๋ค.
์์ ๋ ผ์์ ๋ฐ๋ผ
32 ๋นํธ์ ๊ฒฝ์ฐ ์ฌ์ ํ IMO๋ฅผ ํตํด https://github.com/scikit-learn/scikit-learn/pull/11271 ์ ์ผ๋ถ ํํ๋ก ๋ณํฉํด์ผํฉ๋๋ค. ์์ PR์ ์ด์ ๋ค์ ์ง๊ตํฉ๋๋ค.
์ฐธ๊ณ : OPTICS์ ์ผ๋ถ ๋ฌธ์ ๋ฅผ ์์ ํ๊ณ ELKI์ ์ฐธ์กฐ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ
์คํธ๋ฅผ ์๋ก ๊ณ ์น ๋ metric="euclidean"
์์๋ ์คํจํ์ง๋ง metric="minkowski"
์์๋ ์ฑ๊ณตํฉ๋๋ค. ์์น ์ฐจ์ด๋ ๋ค๋ฅธ ์ฒ๋ฆฌ ์์๋ฅผ ์ ๋ฐํ ๋งํผ ์ถฉ๋ถํ ํฝ๋๋ค (์๊ณ ๊ฐ์ ์ค์ด๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์).
๋๋ ์ด๊ฒ์ ์ ๋ง๋ก ์ต์ํ์ง ์์ง๋ง ๊ธฐ์กด ์๋ฃจ์ ์ด ์๋ค๋ ๊ฒ์ ๋๋์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๊ณ์ฐ์ผ๋ก ๋ณด์ด๋ฉฐ ์ฐ๋ฆฌ๊ฐ ๋ฐํด๋ฅผ ์ฌ๋ฐ ๋ช ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ ๋์ ๊ณผํ ์ปดํจํ ์ปค๋ฎค๋ํฐ์ ์ ๊ทผ ํด ๋ณธ ์ฌ๋์ด ์์ต๋๊น?
์์ง์ ์๋์ง๋ง ๊ทธ๋์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. 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 ๊ตฌํ๊ณผ ๋จ์ผ ์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๋ ๋ฒ์งธ๋ BLAS์ OpenBLAS ๊ตฌํ๊ณผ ๋จ์ผ ์ฝ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. MKL๊ณผ OpenBLAS์ ๋์์ด ๋์ผํ ์ง ํ์ธํ๋ ๊ฒ์
๋๋ค.
์ธ ๋ฒ์งธ๋ BLAS ๋ฐ 4 ์ฝ์ด์ MKL ๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ๋ฌธ์ ๋ euclidean_distances
๋ BLAS LEVEL 3 ํจ์๋ฅผ ํตํด ๋ณ๋ ฌํ๋์ง๋ง cdist
๋ BLAS LEVEL 1 ํจ์ ๋ง ์ฌ์ฉํ๋ค๋ ๊ฒ์
๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ ๊ทธ๊ฒ์ ๊ฑฐ์ ๊ตญ๊ฒฝ์ ๋ฐ๊พธ์ง ์์ต๋๋ค.
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 ๋ ์ค๋ ์ฃผ๋ณ์ ์์ต๋๋ค.
์๊ฐ์ ์ค์ ํ๋ฉด ์๊ฒฉ์ผ๋ก ์ฐธ์ฌํ ์ ์์ต๋๋ค. ์คํ ์ด์?
์ํฉ์ ์์ฝํ๋ฉด
์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ์ ๋ฐ๋ ๋ฌธ์ ์ ๊ฒฝ์ฐ
๊ทธ๋ฐ ๋ค์ ์ ํด๋ฆฌ๋, 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 ๊ฐ์ง ๊ธฐ๋ฅ์ ์ ์ํฉ๋๋ค.
์๋ชป๋๋ ๋น์ฉ์ ๋์นญ์ด ์๋๋๋ค. 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์ ์ ๋ฐ๋๊ฐ ๋ ์๋ฆฌ ๋ฏธ๋ง์ ๋๋ค.
๊ทธ๋ฌ๋ 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 ๋จ์์ ํด๋นํฉ๋๋ค.
์์ ๊ณก์ ์ ๊ทผ์ฌ ๋ถํฌ์
๋๋ค (์ปค๋ ๋ฐ๋ ์ถ์ ๊ฐ ์ฌ์ฉ).
๊ทธ๋ํ๋ ๊ฐ๋ ์ฑ์ ์ํด 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
๋์ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฆ, ํ์ ๋ ๊ฑฐ๋ฆฌ์ ๋น๊ตํ์ง ์๊ณ ์ ๋ ฅ ๋ฐ์ดํฐ์ ๋น๊ต ํ ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ์ ๋ฐ๋๋ฅผ ์ดํด๋ณผ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋น์ ์ ์์ด๋์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด ์ ๋ ์ค์ฐจ๋ฅผ ์ ๋ ฅ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ๋น๊ตํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ฒกํฐ ๋ ธ๋ฆ์ ์ ๋ ฅ ํฌ๊ธฐ์ ์ง๊ณ ์ฒ๋๋ก ์ฌ์ฉํฉ๋๋ค. ํ์ค ์๋ ์ค์ฐจ๋ ์ ํํ ๊ฒฐ๊ณผ์ ํฌ๊ธฐ์ ๋น๊ตํฉ๋๋ค.
์ด ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ง๋ ๋ง์ ๊ฒฐํจ ์ด
computed - exact
์ ์ฌ์กฐ์ ๋ ๋ฒ์ ์ด๋ฏ๋ก ๋์ผํ ์
๋ ฅ์ ๋ํด ํ๊ฐํ ๋ ๋์ผํ ์์๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์๋ฅผ ๋งค ๊น๋๋ค.
(1, 1e-16)
๋(1, 2e-16)
์ ํ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด ์ ๋ ฅ ๋ฐ์ดํฐ์ ์์ ์์ฑ์ด์๋ ๊ฒฝ์ฐ (์ : MNIST์ ํฐ์ ํฝ์ ).
์ฐจ์ด ๊ธฐ๋ฐ ๋ฐฉ์ ์์ ์ฌ์ฉํ๋ฉด ๊ด์ฐฎ์ง ๋ง ๋ํธ ๋ฒ์ ์ด ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๊น? ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ 1 ์ฐจ์ ์คํ์ผ๋ก๋ ์ด๊ฒ์ ์ฐ๊ตฌํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค.
์ ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์๋ ์ค๋ฅ๋ 1
. ์ด๋ ์ค๋ฅ๊ฐ ์ ํํ ๊ฒฐ๊ณผ๋งํผ ํฌ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ซ์๊ฐ ์ ํํ์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ธก์ ํญ๋ชฉ์ ๊ฐ์ 1e-16
๊ฐ๋ฉ๋๋ค. ์ฆ, ๋ฒกํฐ ํ์ค์ ์ฒ๋์ ๋นํด 16 ๋ฒ์งธ ์ซ์ ๋ง ๊บผ์ ธ ์์์ ์๋ฏธํฉ๋๋ค.
์ด ์์์ ๋ฌด์์ ๋ณด์ฌ ์ฃผ๋ ค๋ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฌ์ ํ float64๋ฅผ ์ฌ์ฉํ euclidean_distances์ ์ ๋ฐ๋์ ๋ํด ์ฐ๋ คํ๊ณ ์๋ค๋ฉด, ์ฌ๊ธฐ์ 100 ๊ฐ์ ์ฃผ์์ด ์์ผ๋ฏ๋ก์ด ํ ๋ก ์ ์๋ก์ด ๋ฌธ์ ์ ์์ฝํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ์ค ์ธ๊ณ์ ์์ ๊ฐ์ ๊ทธ๋ฐ ์ ํ๋๋ฅผ ๊ฑฐ์ ๊ฐ์ง ์์ต๋๋ค. ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ ML์ ์ด๋ฌํ ์ข ๋ฅ์ ์ ๋ ฅ์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๋ฃจ๋น ์ค ํ๋ธ์ ๊ฐ์ ํผ์ฆ์ ๊ทธ๋ํ์ MDS๋ฅผ ์ ์ฉํ๊ฑฐ๋ ํฉ๋งจ์ ํ๋ ์ดํ๋ RL ์์ด์ ํธ ๋ฌด๋ฆฌ๊ฐ ์ฐพ์ ์ฑ๊ณต์ ์ธ ์ ๋ต์ ํด๋ฌ์คํฐ๋งํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ํ ๋ฌธ์ ์ ML์ ์ ์ฉ ํ ์ ์์ต๋๋ค.
์ ๋ณด์ ์ด๊ธฐ ์์ค๊ฐ ์ค์ ์ธ๊ณ์ธ ๊ฒฝ์ฐ์๋ ๋๋ถ๋ถ์ ์ซ์๋ฅผ ํด๋ฌ์คํฐ๋ง ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ด๋ จ์ํค๋ ์ค๊ฐ ์ฒ๋ฆฌ๊ฐ์์ ์ ์์ต๋๋ค. ๋งค๊ฐ ๋ณ์๊ฐ ์ค์ ์ธ๊ณ์์ ํต๊ณ์ ์ผ๋ก ์ํ๋ง ๋ ํจ์์ ๋ํ ๊ฒฝ์ฌ ํ๊ฐ ๋ฒ์ ๊ฒฐ๊ณผ์ ๊ฐ์ต๋๋ค.
์ ์ฐ๋ฆฌ๊ฐ ์ฌ์ ํ ์ด๊ฒ์ ๋ ผ์ํ๊ณ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ ๋ชจ๋ scikit-learn์ด ๊ณ์ฐ ์๊ฐ์ ๋ํ ์ ์ถฉ ์ ํ๋์์ ์ต์ ์ ๋คํด์ผํ๋ค๋ ๋ฐ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ฌ ์ํ์ ๋ง์กฑํ์ง ์๋ ์ฌ๋์ ํ ์์ฒญ์ ์ ์ถํด์ผํฉ๋๋ค.