๋ฐ์ํ
Broadcasting
Numpy์ Broadcasting์ ์๋ก ๋ค๋ฅธ ํฌ๊ธฐ์ ๋ฐฐ์ด ๊ฐ์ ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค.
- Broadcasting์ ํตํด Numpy๋ ๋ ์์ ๋ฐฐ์ด์ ๋ ํฐ ๋ฐฐ์ด๊ณผ ๋์ผํ ๋ชจ์์ผ๋ก ํ์ฅํ์ฌ ์์๋ณ(element-wise) ์ฐ์ฐ์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ํจ์จ์ ์ธ ๋ฒกํฐํ ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋ธ๋ก๋์บ์คํธ๋ ์ฐ์ ์ฐ์ฐ ์ค์ numpy๊ฐ ๋ค์ํ ๋ชจ์์ ๊ฐ์ง ๋ฐฐ์ด์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋์ง ์ค๋ช ํฉ๋๋ค.
- ํน์ ์ ์ฝ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ์์ ๋ฐฐ์ด์ ๋ ํฐ ๋ฐฐ์ด์ ๊ฑธ์ณ "๋ธ๋ก๋์บ์คํธ"๋์ด ํธํ ๊ฐ๋ฅํ ๋ชจ์์ ๊ฐ์ต๋๋ค.
Examples
A (2d array): 5 x 4
B (1d array): 1
Result (2d array): 5 x 4
A (2d array): 5 x 4
B (1d array): 4
Result (2d array): 5 x 4
A (3d array): 15 x 3 x 5
B (3d array): 15 x 1 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 5
Result (3d array): 15 x 3 x 5
A (3d array): 15 x 3 x 5
B (2d array): 3 x 1
Result (3d array): 15 x 3 x 5
np.array([[1,2],[3,4]]) + np.array([[10]])
array([[11, 12],
[13, 14]])
np.array([[1,2],[3,4]]) + np.array([[10,100]])
array([[ 11, 102],
[ 13, 104]])
A = np.array([[1,2]])
B = np.array([[10],[100]])
print(A.shape, B.shape)
C = A + B
C
(1, 2) (2, 1)
array([[ 11, 12],
[101, 102]])
X = np.array([[1]]*3) + np.array([[0]*10]) # 3 * 1, 1 * 10
X
X = np.array([[1]]*3) + np.array([[0]*10])
X
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
- np.array([[1]]*3)๋ [[1]] ๋ฐฐ์ด์ 3๋ฒ ๋ฐ๋ณตํ์ฌ 2์ฐจ์ ๋ฐฐ์ด๋ก ๋ง๋๋ ์ฐ์ฐ์ ๋๋ค.
- ์ด ๊ฒฝ์ฐ, ํ์์ (3, 1)์ด ๋๋ฉฐ ๊ฒฐ๊ณผ๋ [[1], [1], [1]]์ ๋๋ค.
- np.array([[0]*10])๋ [0]์ 10๋ฒ ๋ฐ๋ณตํ์ฌ ๊ธธ์ด๊ฐ 10์ธ 2์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ญ๋๋ค.
- ์ด ๊ฒฝ์ฐ, ํ์์ (1, 10)์ด ๋๋ฉฐ ๊ฒฐ๊ณผ๋ [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]์ ๋๋ค.
- [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]๊ฐ 3๋ฒ ๋ฐ๋ณต๋ 3 x 10 ๋ฐฐ์ด์ ๋๋ค.
# ๋ฐฐ์ด a ์์ฑ (3x1 ํฌ๊ธฐ)
a = np.array([[1], [2], [3]])
# ๋ฐฐ์ด a์ ์ ์น(ํ๋ ฌ์ ์ ์น)๋ฅผ ๊ณ์ฐํ์ฌ ๋ฐฐ์ด b์ ์ ์ฅ (1x3 ํฌ๊ธฐ)
b = a.T
# a์ b๋ฅผ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐ (broadcasting ๊ธฐ๋ฅ ์ฌ์ฉ)
result = a + b
# ๊ฒฐ๊ณผ ๋ฐฐ์ด ์ถ๋ ฅ
result
array([[2, 3, 4],
[3, 4, 5],
[4, 5, 6]])
Meshgrid
numpy.meshgrid๋ ๋ค์ฐจ์ ๊ฒฉ์ ์ขํ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํจ์์ ๋๋ค.
- ๋ณดํต 2์ฐจ์ ํ๋ฉด์ด๋ 3์ฐจ์ ๊ณต๊ฐ์์์ ์ขํ๊ณ๋ฅผ ๋ง๋ค ๋ ์ ์ฉํฉ๋๋ค.
- ์ด ํจ์๋ ์ฃผ๋ก ํจ์์ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๊ฑฐ๋ ๋ค์ฐจ์ ๋ฐ์ดํฐ์ ์๊ฐํ๋ฅผ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
meshgrid์ ์ฌ์ฉ๋ฒ
- numpy.meshgrid๋ 1์ฐจ์ ์ขํ ๋ฐฐ์ด ๋ ๊ฐ๋ฅผ ๋ฐ์์ ๋ ๊ฐ์ 2์ฐจ์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
- ๊ฐ ๋ฐํ๋ ๋ฐฐ์ด์ ์ขํ ๊ทธ๋ฆฌ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ฒกํฐํ๋ ํ๊ฐ๋ฅผ ์ํด D x N ๋ฉ์ฌ ๊ทธ๋ฆฌ๋๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
v = np.array([10,20,30]) # N
w = np.array([5,6]) # D
X, Y = np.meshgrid(v, w)
X + Y
array([[15, 25, 35],
[16, 26, 36]])
Axis ordering
์ ์์ ์ฐจ์์ ์ถ ๋ฒํธ๋ ๋ฐฐ์ด์ ๋ชจ์ ์์์ ํด๋น ์ฐจ์์ ์ธ๋ฑ์ค์ ๋๋ค.
- ์ธ๋ฑ์ฑํ๋ ๋์ ํด๋น ์ฐจ์์ ์ก์ธ์คํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์์น์ด๊ธฐ๋ ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, 2D ๋ฐฐ์ด a์ ๋ชจ์์ด (5,6)์ด๋ฉด a[4,5]๊น์ง a[0,0]์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ฐ๋ผ์ ์ถ 0์ ์ฒซ ๋ฒ์งธ ์ฐจ์("ํ")์ด๊ณ , ์ถ 1์ ๋ ๋ฒ์งธ ์ฐจ์("์ด")์ ๋๋ค.
- "ํ"๊ณผ "์ด"์ด ์๋ฏธ๊ฐ ์๋ ๊ณ ์ฐจ์์์๋ ์ถ์ ๊ด๋ จ๋ ๋ชจ์๊ณผ ์ง์๋ก ์๊ฐํด ๋ณด์ญ์์ค.
- ์๋ฅผ ๋ค์ด np.sum(axis=n)์ ํ๋ฉด ์ฐจ์ n์ด ์ถ์๋๊ณ ์ญ์ ๋๋ฉฐ ์ ํ๋ ฌ์ ๊ฐ ๊ฐ์ ์ถ์๋ ๊ฐ์ ํฉ๊ณผ ๊ฐ์ต๋๋ค.
- ์๋ฅผ ๋ค์ด b์ ๋ชจ์์ด (5,6,7,8)์ด๊ณ c = b.sum(axis=2)์ด๋ฉด ์ถ 2(ํฌ๊ธฐ 7์ dimension)๊ฐ ์ถ์๋๊ณ ๊ฒฐ๊ณผ๋ ๋ชจ์์ด (5,6,8)๋ฉ๋๋ค.
- ๋ํ c[x,y,z]๋ ๋ชจ๋ ์์ b[x,y,:,z]์ ํฉ๊ณผ ๊ฐ์ต๋๋ค.
X = np.array([[0,0,0], [1,1,1]])
X.shape
# axis 0 is row; axis 1 is column
# Result: (2, 3)
X.sum(axis=0) # ์ฐจ์ 0์ด ์ถ์ ๋ฐ ์ญ์ ๋๊ฑฐ๋ ์ฐจ์ 0์ ๋ํด ์ง๊ณ๋ฉ๋๋ค
# Result: array([1, 1, 1])
X.sum(axis=1) # ์ฐจ์ 1์ด ์ถ์ ๋ฐ ์ญ์ ๋๊ฑฐ๋ ์ฐจ์ 0์ ๋ํด ์ง๊ณ๋ฉ๋๋ค
# Result: array([0, 3])
# 1๋ถํฐ 24๊น์ง์ ์ ์๋ก ๊ตฌ์ฑ๋ 1์ฐจ์ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
X = np.array(range(1, 24 + 1))
# ๋ฐฐ์ด X๋ฅผ (2, 3, 4) ํ์์ผ๋ก ์ฌ๊ตฌ์กฐํํ์ฌ 3์ฐจ์ ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค.
# ์ด๋, ๋ฐฐ์ด์ 2๊ฐ์ 3x4 ํ๋ ฌ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
X = X.reshape(2, 3, 4)
# ์ฌ๊ตฌ์กฐํ๋ 3์ฐจ์ ๋ฐฐ์ด X๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
X
X.shape
# (2, 3, 4)
X.sum(axis=0)
array([[14, 16, 18, 20],
[22, 24, 26, 28],
[30, 32, 34, 36]])
X๋ np.arange(24).reshape(2, 3, 4)์ ํตํด ๋ง๋ค์ด์ง 3์ฐจ์ ๋ฐฐ์ด ์ ๋๋ค.
- X[0]: ์ฒซ ๋ฒ์งธ 3x4 ํ๋ ฌ
[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12]],
- X[1]: ๋ ๋ฒ์งธ 3x4 ํ๋ ฌ
[[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]]]
- axis=0์ ๋ฐ๋ผ ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ด: [1+13, 5+17, 9+21] = [14, 22, 30]
- ๋ ๋ฒ์งธ ์ด: [2+14, 6+18, 10+22] = [16, 24, 32]
- ์ธ ๋ฒ์งธ ์ด: [3+15, 7+19, 11+23] = [18, 26, 34]
- ๋ค ๋ฒ์งธ ์ด: [4+16, 8+20, 12+24] = [20, 28, 36]
axis=0๋ ๋ฐฐ์ด์์ ์ฒซ ๋ฒ์งธ ์ถ์ ๋ํ๋ ๋๋ค. ๋ฐฐ์ด์ ์ถ(axis)์ ๊ฐ ๋ฐฐ์ด์ ์ฐจ์์ ๋ํ๋ด๋ฉฐ, axis๋ ์ถ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
- 2์ฐจ์ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ:
- axis=0๋ ํ์ ์๋ฏธํฉ๋๋ค. axis=0์ ๋ฐ๋ผ ํฉ์ฐํ๋ค๋ ๊ฒ์ ๊ฐ ์ด์ ๋ฐ๋ผ ๊ฐ๋ค์ ํฉ์ฐํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๋ฐ๋ผ์, axis=0์ผ๋ก ํฉ์ฐํ๋ฉด ๊ฒฐ๊ณผ๋ก ๊ฐ ์ด์ ๊ฐ๋ค์ ํฉ์ฐํ ๊ฐ๋ค์ด ๋ฐํ๋ฉ๋๋ค
- axis=0์ ๋ฐ๋ผ ํฉ์ฐํ ๋๋ ๊ฐ ์ด์ ๊ฐ๋ค์ ํฉ์ฐํ์ฌ ์ด๋ณ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
X.sum(axis=1)
array([[15, 18, 21, 24],
[51, 54, 57, 60]])
- X.sum(axis=1)์ ์คํํ๋ฉด ๊ฐ '์ธต'์์ ๋์ผํ ์ด์ ์์นํ ์์๋ค์ ํฉ์ ๊ตฌํ๊ฒ ๋ฉ๋๋ค.
- ๋ฐ๋ผ์ ๊ฐ '์ธต'์ ์ด๋ณ ํฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฒซ ๋ฒ์งธ '์ธต':
- ์ฒซ ๋ฒ์งธ ์ด์ ํฉ: 1 + 5 + 9 = 15
- ๋ ๋ฒ์งธ ์ด์ ํฉ: 2 + 6 + 10 = 18
- ์ธ ๋ฒ์งธ ์ด์ ํฉ: 3 + 7 + 11 = 21
- ๋ค ๋ฒ์งธ ์ด์ ํฉ: 4 + 8 + 12 = 24
- ๋ ๋ฒ์งธ '์ธต':
- ์ฒซ ๋ฒ์งธ ์ด์ ํฉ: 13 + 17 + 21 = 51
- ๋ ๋ฒ์งธ ์ด์ ํฉ: 14 + 18 + 22 = 54
- ์ธ ๋ฒ์งธ ์ด์ ํฉ: 15 + 19 + 23 = 57
- ๋ค ๋ฒ์งธ ์ด์ ํฉ: 16 + 20 + 24 = 60
- ์ฒซ ๋ฒ์งธ '์ธต':
X.sum(axis=2)
array([[10, 26, 42],
[58, 74, 90]])
- X.sum(axis=2)์ ์คํํ๋ฉด, ๊ฐ '์ธต'์ ๊ฐ ํ์ ์๋ ์์๋ค์ ํฉ์ ๊ตฌํฉ๋๋ค:
- ์ฒซ ๋ฒ์งธ '์ธต':
- ์ฒซ ๋ฒ์งธ ํ์ ํฉ: 1 + 2 + 3 + 4 = 10
- ๋ ๋ฒ์งธ ํ์ ํฉ: 5 + 6 + 7 + 8 = 26
- ์ธ ๋ฒ์งธ ํ์ ํฉ: 9 + 10 + 11 + 12 = 42
- ๋ ๋ฒ์งธ '์ธต':
- ์ฒซ ๋ฒ์งธ ํ์ ํฉ: 13 + 14 + 15 + 16 = 58
- ๋ ๋ฒ์งธ ํ์ ํฉ: 17 + 18 + 19 + 20 = 74
- ์ธ ๋ฒ์งธ ํ์ ํฉ: 21 + 22 + 23 + 24 = 90
X.sum(axis=(1,2))
array([ 78, 222])
- X.sum(axis=(1,2))์ ์คํํ๋ฉด, ๊ฐ '์ธต'์์ ๋ชจ๋ ํ๊ณผ ์ด์ ์๋ ์์๋ค์ ์ดํฉ์ ๊ตฌํฉ๋๋ค:
- ์ฒซ ๋ฒ์งธ '์ธต'์ ํฉ:
- (1 + 2 + 3 + 4) + (5 + 6 + 7 + 8) + (9 + 10 + 11 + 12) = 10 + 26 + 42 = 78
- ๋ ๋ฒ์งธ '์ธต'์ ํฉ:
- (13 + 14 + 15 + 16) + (17 + 18 + 19 + 20) + (21 + 22 + 23 + 24) = 58 + 74 + 90 = 222
- ๊ฒฐ๊ณผ์ ์ผ๋ก, X.sum(axis=(1,2))์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค:
X.sum(axis=(0,1,2))
# Result: 300
- X.sum(axis=(0,1,2))์ ์คํํ๋ฉด, ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ค์ ์ดํฉ์ ๊ณ์ฐํฉ๋๋ค:
- ์ฒซ ๋ฒ์งธ '์ธต': (1 + 2 + 3 + 4) + (5 + 6 + 7 + 8) + (9 + 10 + 11 + 12) = 78
- ๋ ๋ฒ์งธ '์ธต': (13 + 14 + 15 + 16) + (17 + 18 + 19 + 20) + (21 + 22 + 23 + 24) = 222
- ๋ชจ๋ '์ธต'์ ํฉ๊ณ: 78 + 222 = 300
- ๋ฐ๋ผ์, X.sum(axis=(0,1,2))์ ๊ฒฐ๊ณผ๋ 300์ด ๋ฉ๋๋ค. ์ด๋ ๋ฐฐ์ด ๋ด ๋ชจ๋ ์์์ ์ดํฉ์ ๋ํ๋ด๋ ์ค์นผ๋ผ ๊ฐ์ ๋๋ค.
# 2๊ฐ์ 3์ฐจ์ ์ X์ Y๋ฅผ ์ ์ธ
X = np.array([0, 0, 0]) # ์ฒซ ๋ฒ์งธ 3์ฐจ์ ์ X
Y = np.array([1, 1, 1]) # ๋ ๋ฒ์งธ 3์ฐจ์ ์ Y
# ๋ ์ X์ Y ์ฌ์ด์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
distance = np.sqrt(np.sum((X - Y)**2)) # ์ฐจ์ด ๋ฒกํฐ(X - Y)์ ์ ๊ณฑ์ ๊ตฌํ๊ณ , ํฉ์ ๊ณ์ฐํ ํ ์ ๊ณฑ๊ทผ์ ๊ตฌํจ
print(distance) # ๊ณ์ฐ๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
# Result: 1.7320508075688772
import numpy as np
# 2x3 ๋ฐฐ์ด์ ์ญ์์ผ๋ก ์์ฑ
X = np.array(np.arange(2 * 3, 0, -1).reshape(2, 3))
print(X) # ์์ฑ๋ ๋ฐฐ์ด ์ถ๋ ฅ
print() # ์ค ๋ฐ๊ฟ
# axis=0์ ๋ํด ๋ฐฐ์ด์ ์ ๋ ฌ
print("axis=0\\n", np.sort(X, axis=0))
print() # ์ค ๋ฐ๊ฟ
# axis=-1(๋๋ axis=1)์ ๋ํด ๋ฐฐ์ด์ ์ ๋ ฌ
print("axis=-1\\n", np.sort(X, axis=-1))
print() # ์ค ๋ฐ๊ฟ
# ๊ธฐ๋ณธ ์ถ์ axis=-1(๋๋ axis=1)์ด๋ฏ๋ก ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
print("default is -1\\n", np.sort(X))
print() # ์ค ๋ฐ๊ฟ
# axis=None์ ์ฌ์ฉํ์ฌ ์ ์ฒด ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ์ ๋ ฌ
print("axis=None\\n", np.sort(X, axis=None))
[[6 5 4]
[3 2 1]]
axis=0
[[3 2 1]
[6 5 4]]
axis=-1
[[4 5 6]
[1 2 3]]
default is -1
[[4 5 6]
[1 2 3]]
axis=None
[1 2 3 4 5 6]
- X: 2x3 ํํ์ ๋ฐฐ์ด๋ก, 2๊ฐ์ ํ๊ณผ 3๊ฐ์ ์ด์ ๊ฐ์ง ๋ฐฐ์ด์
๋๋ค.
- ์ด ๋ฐฐ์ด์*np.arange(2*3, 0, -1).reshape(2,3)๋ฅผ ์ฌ์ฉํ์ฌ 6๋ถํฐ 1๊น์ง์ ์ซ์๋ฅผ 2x3 ๋ฐฐ์ด ํํ๋ก ์ ๋ ฌํ ๊ฒ์ ๋๋ค.
- ์ ๋ ฌ ๊ฒฐ๊ณผ:
- axis=0: ์ด ์ต์
์ ์ฌ์ฉํ๋ฉด ๊ฐ ์ด์ ๋ฐ๋ผ ๋ฐฐ์ด์ด ์ ๋ ฌ๋ฉ๋๋ค. X ๋ฐฐ์ด์ ๊ฐ ์ด์ ์ ๋ ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฒซ ๋ฒ์งธ ์ด: [3, 6]
- ๋ ๋ฒ์งธ ์ด: [2, 5]
- ์ธ ๋ฒ์งธ ์ด: [1, 4]
- axis=-1 ๋๋ axis=1: ์ด ์ต์
์ ์ฌ์ฉํ๋ฉด ๊ฐ ํ์ ๋ฐ๋ผ ๋ฐฐ์ด์ด ์ ๋ ฌ๋ฉ๋๋ค. X ๋ฐฐ์ด์ ๊ฐ ํ์ ์ ๋ ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฒซ ๋ฒ์งธ ํ: [1, 2, 3]
- ๋ ๋ฒ์งธ ํ: [4, 5, 6]
- axis=None: ์ด ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ด 1์ฐจ์์ผ๋ก ํผ์ณ์ง ๋ค์ ์ ๋ ฌ๋ฉ๋๋ค. X ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ํผ์น ํ ์ ๋ ฌํ๋ฉด [1, 2, 3, 4, 5, 6]๊ฐ ๋ฉ๋๋ค.
- axis=0: ์ด ์ต์
์ ์ฌ์ฉํ๋ฉด ๊ฐ ์ด์ ๋ฐ๋ผ ๋ฐฐ์ด์ด ์ ๋ ฌ๋ฉ๋๋ค. X ๋ฐฐ์ด์ ๊ฐ ์ด์ ์ ๋ ฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ฝ
- axis=0: ๊ฐ ์ด์ ๋ฐ๋ผ ์ ๋ ฌํฉ๋๋ค.
- axis=1 ๋๋ axis=-1: ๊ฐ ํ์ ๋ฐ๋ผ ์ ๋ ฌํฉ๋๋ค.
- axis=None: ๋ฐฐ์ด์ 1์ฐจ์์ผ๋ก ํผ์น ํ ์ ์ฒด๋ฅผ ์ ๋ ฌํฉ๋๋ค.
sort vs argsort vs partition vs argpartition
- argmin, argmax, …
# ๋ฐฐ์ด `X` ์ด๊ธฐํ
X = np.array([4,10,1,20,45,100,2,1])
print('X =\\n', X)
# ๋ฐฐ์ด `X`์ ์์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
print('sorted =\\n', np.sort(X))
# ๋ฐฐ์ด `X`๋ฅผ ์ ๋ ฌํ์ ๋ ์์์ ์๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
print('argsorted =\\n', np.argsort(X))
# ๋ฐฐ์ด `X`์์ `3`๋ฒ์งธ ์์ ๊ฐ์ด ์์นํด์ผ ํ ์๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ถ์ ์ผ๋ก ์ ๋ ฌ
# ์ฒซ `3`๊ฐ์ ์์๋ ์์ ๊ฐ๋ค๋ก ๊ตฌ์ฑ๋๊ณ , ๋๋จธ์ง ์์๋ค์ ์์ง ์ ๋ ฌ๋์ง ์์ ์ํ๋ก ๋ฐฐ์ด๋จ
print('partitioned first 3 =\\n', np.partition(X, 3))
# ๋ฐฐ์ด `X`์์ `3`๋ฒ์งธ ์์ ๊ฐ์ด ์์นํด์ผ ํ ์๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ถ ์ ๋ ฌํ์ ๋์ ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
print('argpartitioned first 3 =\\n', np.argpartition(X, 3))
# ๋ฐฐ์ด `X`์์ `-3`๋ฒ์งธ (๋ง์ง๋ง ์ธ ๋ฒ์งธ) ํฐ ๊ฐ์ด ์์นํด์ผ ํ ์๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ ๋ถ๋ถ์ ์ผ๋ก ์ ๋ ฌ
# ๋ง์ง๋ง `3`๊ฐ์ ์์๋ ํฐ ๊ฐ๋ค๋ก ๊ตฌ์ฑ๋๊ณ , ๋๋จธ์ง ์์๋ค์ ์์ง ์ ๋ ฌ๋์ง ์์ ์ํ๋ก ๋ฐฐ์ด๋จ
print('partitioned last 3=\\n', np.partition(X, -3))
# ๋ฐฐ์ด `X`์์ `-3`๋ฒ์งธ (๋ง์ง๋ง ์ธ ๋ฒ์งธ) ํฐ ๊ฐ์ด ์์นํด์ผ ํ ์๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ถ ์ ๋ ฌํ์ ๋์ ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ
print('argpartitioned last 3=\\n', np.argpartition(X, -3))
X =
[ 4 10 1 20 45 100 2 1]
sorted =
[ 1 1 2 4 10 20 45 100]
argsorted =
[2 7 6 0 1 3 4 5]
partitioned first 3 =
[ 2 1 1 4 45 100 10 20]
argpartitioned first 3 =
[6 7 2 0 4 5 1 3]
partitioned last 3=
[ 2 1 1 4 10 20 45 100]
argpartitioned last 3=
[6 7 2 0 1 3 4 5]
Lab.
์ถ 0์ ๋ฐ๋ผ 2-d ๋ฐฐ์ด T๋ฅผ ์ ๋ ฌํ๊ณ , ์ ๋ ฌ ํค๋ ์ถ 1์ ๋ฐ๋ผ ์์์ ํฉ์ ๋๋ค.
T = np.array([[2,2],[-1,10],[0,1]]) # 2์ฐจ์ ๋ฐฐ์ด T๋ฅผ ์ด๊ธฐํ
I = np.argsort(np.sum(T, axis=1)) # ์ถ 1์ ๋ฐ๋ผ ๊ฐ ํ์ ํฉ๊ณ๋ฅผ ๊ตฌํ ํ, ๊ทธ ํฉ๊ณ์ ์ธ๋ฑ์ค๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
T[I, :] # ์ ๋ ฌ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด T์ ํ์ ์ฌ์ ๋ ฌ
- T = np.array([[2,2],[-1,10],[0,1]])์ 2์ฐจ์ ๋ฐฐ์ด T๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ์ด ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
[[ 2, 2],
[-1, 10],
[ 0, 1]]
- I = np.argsort(np.sum(T, axis=1)) ๋ช
๋ น์ด๋ ๋ ๋ถ๋ถ์ผ๋ก ๋๋ฉ๋๋ค:
- np.sum(T, axis=1)๋ ๋ฐฐ์ด T์ ๊ฐ ํ์ ๋ํ ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๋ฐ๋ผ์, ๊ฐ ํ์ ํฉ๊ณ๋ [4, 9, 1]์ด ๋ฉ๋๋ค.
- np.argsort(...)๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ ๋์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
- [4, 9, 1]์ ์์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉด [1, 4, 9]๊ฐ ๋๊ณ , ์ด์ ํด๋นํ๋ ์๋ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ [2, 0, 1]์ ๋๋ค.T[I, :]๋ ๋ฐฐ์ด T์ ํ์ I ๋ฐฐ์ด์ ๋ฐ๋ผ ์ฌ์ ๋ ฌํฉ๋๋ค.
- I๋ [2, 0, 1]์ด๋ฏ๋ก, T์ ํ๋ ์ด ์ธ๋ฑ์ค ์์๋๋ก ์ฌ๋ฐฐ์น๋ฉ๋๋ค.
- ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ์๋ฏธํฉ๋๋ค:
- T์ 2๋ฒ์งธ ํ์ด ์ฒซ ๋ฒ์งธ ์์น๋ก ์ด๋ํฉ๋๋ค.
- ([0, 1])T์ 0๋ฒ์งธ ํ์ด ๋ ๋ฒ์งธ ์์น๋ก ์ด๋ํฉ๋๋ค.
- ([2, 2])T์ 1๋ฒ์งธ ํ์ด ์ธ ๋ฒ์งธ ์์น๋ก ์ด๋ํฉ๋๋ค. ([-1, 10])
- ๊ฒฐ๊ณผ์ ์ผ๋ก, T[I, :]๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฐฐ์ด์ด ์์ฑ๋ฉ๋๋ค:
[[ 0, 1],
[ 2, 2],
[-1, 10]]
- ์ด ๋ฐฐ์ด์ ์๋ ๋ฐฐ์ด T์ ํ์ ๊ฐ ํ์ ํฉ๊ณ๊ฐ ์์ ์์๋๋ก ์ฌ์ ๋ ฌํ ๊ฒ์ ๋๋ค.
- ์ฒซ ๋ฒ์งธ ํ์ ํฉ๊ณ๊ฐ ๊ฐ์ฅ ์๊ณ ([0, 1]์ ํฉ๊ณ๋ 1), ๋ค์์ผ๋ก [2, 2]์ ํฉ๊ณ๋ 4,
- ๋ง์ง๋ง์ผ๋ก [-1, 10]์ ํฉ๊ณ๋ 9๋ก, ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋ ์์๋ฅผ ๋ฐ์ํฉ๋๋ค.
array([[ 0, 1],
[ 2, 2],
[-1, 10]])
Vectorized Function
๋ฒกํฐํ๋ ํจ์๋ ๋ฐฐ์ด์ ์์๋ณ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ฒกํฐํ๋ ์ฐ์ฐ์ ์ํํ๋ ํจ์์ ๋๋ค.
- Numpy์์ ๋ฒกํฐํ๋ ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฑ๋ฅ ํฅ์๊ณผ ์ฝ๋ ๊ฐ๊ฒฐ์ฑ ์ธก๋ฉด์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- Numpy์ ๋ฒกํฐํ ๊ธฐ๋ฅ์ ํตํด ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ฐฐ์ด ์ ์ฒด์ ๋ํด ์ฐ์ฐ์ ์ํํ ์ ์์ต๋๋ค.
- map ํจ์์ ์ ์ฌํฉ๋๋ค.
import math
# ์ฃผ์ด์ง ๊ฐ ์ค ์ ๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ํฐ ๊ฐ์ ์ฐพ์ต๋๋ค.
# ์ฃผ์ด์ง ๊ฐ: 1, 2, 3, 4, 5, -100
# key ๋งค๊ฐ๋ณ์๋ก lambda ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ๊ฐ์ ์ ๋๊ฐ์ ๋น๊ตํฉ๋๋ค.
max_value = max(1, 2, 3, 4, 5, -100, key=lambda x: math.fabs(x))
# ๊ฐ์ฅ ํฐ ์ ๋๊ฐ์ ๊ฐ์ง ๊ฐ(์ด ๊ฒฝ์ฐ -100)์ ๋ฐํํฉ๋๋ค.
print(max_value)
# Result: -100
from functools import partial
import math
# functools ๋ชจ๋์์ partial ํจ์๋ฅผ ๋ถ๋ฌ์ต๋๋ค.
# max ํจ์์ key ๋งค๊ฐ๋ณ์์ lambda ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์
๋ ฅ๊ฐ์ ์ ๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ต๋ ๊ฐ์ ์ฐพ๋๋ก ๋ถ๋ถ ์ ์ฉํฉ๋๋ค.
mymax = partial(max, key=lambda x: math.fabs(x))
# ์ด์ mymax ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ์๋์ผ๋ก key ๋งค๊ฐ๋ณ์์ lambda ํจ์๊ฐ ์ ์ฉ๋ฉ๋๋ค.
# ๋ ๋ฆฌ์คํธ [10, 2, 3]์ [4, 5, 6]์ ๋น๊ตํ์ฌ ๊ฐ ์์์์ ๋ ํฐ ๊ฐ์ ๋ฐํํฉ๋๋ค.
result = list(map(max, [10,2,3], [4,5,6]))
# ๊ฒฐ๊ณผ๋ [10, 5, 6]์
๋๋ค. ์ด๋ ๊ฐ ์ธ๋ฑ์ค์์ ๋ ํฐ ๊ฐ์ ๋ฐํํ ๊ฒ์
๋๋ค.
print(result) # [10, 5, 6]
- map ํจ์๋ ์ฃผ์ด์ง ๋ ๋ฆฌ์คํธ๋ฅผ max ํจ์์ ๊ฐ๊ฐ์ ์์๊ฐ ๋์ํ๋๋ก ๋งคํํฉ๋๋ค.
- ์ฆ, max ํจ์๋ ๊ฐ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์์๋ฅผ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ ๋ฐํํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์์ ๋น๊ต: max(10, 4)๋ 10๊ณผ 4๋ฅผ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ธ 10์ ๋ฐํํฉ๋๋ค.
- ๋ ๋ฒ์งธ ์์ ๋น๊ต: max(2, 5)๋ 2์ 5๋ฅผ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ธ 5๋ฅผ ๋ฐํํฉ๋๋ค.
- ์ธ ๋ฒ์งธ ์์ ๋น๊ต: max(3, 6)๋ 3๊ณผ 6์ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ธ 6์ ๋ฐํํฉ๋๋ค.
list(map(mymax, [-10,2,3], [4,5,-6]))
# Result: [-10, 5, -6]
u = np.array([100,2,3,4])
v = np.array([1,2,3,4])
w = np.array([4,3,2,1])
np.vectorize(max)(u, v, w)
# array([100, 3, 3, 4])
dist = np.vectorize(lambda x, y: np.sqrt(x**2 + y**2))
dist(v, w)
# array([4.12310563, 3.60555128, 3.60555128, 4.12310563])
- ์์ ๊ฐ์ด np.vectorize๋ ๋๋ค ํจ์๋ฅผ ๋ฒกํฐํํ์ฌ ๊ฐ ์์์ ์ ์ฉํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐํํฉ๋๋ค. ๊ณ์ฐ๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฒซ ๋ฒ์งธ ์์ ์์ ๋ํ ๊ฑฐ๋ฆฌ: sqrt(v[0]**2 + w[0]**2)
- ๋ ๋ฒ์งธ ์์ ์์ ๋ํ ๊ฑฐ๋ฆฌ: sqrt(v[1]**2 + w[1]**2)
- ์ธ ๋ฒ์งธ ์์ ์์ ๋ํ ๊ฑฐ๋ฆฌ: sqrt(v[2]**2 + w[2]**2)
- ๋ค ๋ฒ์งธ ์์ ์์ ๋ํ ๊ฑฐ๋ฆฌ: sqrt(v[3]**2 + w[3]**2)
๊ฒฐ๊ณผ์ ์ผ๋ก [4.12310563, 3.60555128, 3.60555128, 4.12310563]๊ฐ ๋ฐํ๋ฉ๋๋ค.
# 3D ํฌ์ธํธ 0์์ ๊ณ์ฐ๋ ๋ฒกํฐํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
import numpy as np
def calculate_euclidean_distances(points):
# ์ด ํจ์๋ ์
๋ ฅ๋ 3D ์ ๋ค์ ๋ฐฐ์ด์์ ์์ ์ผ๋ก๋ถํฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
# points: ๊ฐ ํ์ด [x, y, z]๋ก ํํ๋ 3D ์ ์ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด.
# points ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ๊ณฑ์ ๊ณ์ฐํ๊ณ , ๊ฐ ์ ์ x^2 + y^2 + z^2๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ์ถ 1์ ๋ฐ๋ผ ํฉ์ ๊ตฌํฉ๋๋ค.
squared_sum = np.sum(np.square(points), axis=1)
# ์ ๊ณฑ์ ํฉ์ ์ ๊ณฑ๊ทผ์ ๊ณ์ฐํ์ฌ ๊ฐ ์ ์ ๋ํ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํฉ๋๋ค.
distances = np.sqrt(squared_sum)
return distances
# ์์ ์ฌ์ฉ๋ฒ:
# 3D ์ ์ ๋ฐฐ์ด์ ์ ์ํฉ๋๋ค.
points = np.array([
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[-1, -2, -3]
])
# ์์ (0, 0, 0)์์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
distances = calculate_euclidean_distances(points)
# ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print(distances)
- calculate_euclidean_distances ํจ์๋ ๊ฐ ํ์ด 3D ์ [x, y, z]๋ฅผ ๋ํ๋ด๋ 2์ฐจ์ ๋ฐฐ์ด points๋ฅผ ๋ฐ์ต๋๋ค.
- ํจ์ ๋ด๋ถ์์ points ๋ฐฐ์ด์ ๊ฐ ์์์ ์ ๊ณฑ์ ๊ณ์ฐํ ํ, ์ถ 1์ ๋ฐ๋ผ ํฉ์ ๊ตฌํฉ๋๋ค(๊ฐ ์ ์ x^2+ y^2 + z^2๋ฅผ ํฉ์ฐ).
- ์ ๊ณฑ์ ํฉ์ ์ ๊ณฑ๊ทผ์ ๊ณ์ฐํ์ฌ ๊ฐ ์ ์ ๋ํ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํฉ๋๋ค.
- ํจ์๋ ์์ ์์ ๊ฐ ์ ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
Numpy linear algebra (Numpy ์ ํ ๋์)
Numpy๋ ์ ํ ๋์ ์ฐ์ฐ์ ์ง์ํ๊ธฐ ์ํด ๋ง์ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
import numpy as np
# 2 x 3 ๋๋ค ํ๋ ฌ ์์ฑ
X = np.random.randn(2, 3)
print(X) # ํ๋ ฌ X ์ถ๋ ฅ
# ํ๋ ฌ X์ ์ ์น(transpose) ๊ณ์ฐ
print(X.T) # ํ๋ ฌ X์ ์ ์น ์ถ๋ ฅ
# ํฌ๊ธฐ๊ฐ 3์ธ ๋๋ค ๋ฒกํฐ ์์ฑ
y = np.random.randn(3)
print(y) # ๋ฒกํฐ y ์ถ๋ ฅ
# ํ๋ ฌ X์ ๋ฒกํฐ y์ ํ๋ ฌ-๋ฒกํฐ ๊ณฑ์
print(X.dot(y)) # ํ๋ ฌ-๋ฒกํฐ ๊ณฑ์
๊ฒฐ๊ณผ ์ถ๋ ฅ
# np.dot() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ฌ X์ ๋ฒกํฐ y์ ๊ณฑ์
print(np.dot(X, y)) # ํ๋ ฌ-๋ฒกํฐ ๊ณฑ์
๊ฒฐ๊ณผ ์ถ๋ ฅ (X.dot(y)์ ๋์ผ)
# ํ๋ ฌ X์ X์ ์ ์น(X.T)์ ํ๋ ฌ-ํ๋ ฌ ๊ณฑ์
print(X.dot(X.T)) # ํ๋ ฌ-ํ๋ ฌ ๊ณฑ์
๊ฒฐ๊ณผ ์ถ๋ ฅ
# ํ๋ ฌ X์ ์ ์น(X.T)์ ํ๋ ฌ X์ ํ๋ ฌ-ํ๋ ฌ ๊ณฑ์
print(X.T.dot(X)) # ํ๋ ฌ-ํ๋ ฌ ๊ณฑ์
๊ฒฐ๊ณผ ์ถ๋ ฅ
[[-0.67521745 -0.25112232 -0.53902013]
[-0.31444559 0.26792464 -0.91960302]]
[[-0.67521745 -0.31444559]
[-0.25112232 0.26792464]
[-0.53902013 -0.91960302]]
[-0.27857094 0.11301957 -0.0460988 ]
[0.1845624 0.16026873]
[0.1845624 0.16026873]
[[0.80952372 0.64072183]
[0.64072183 1.01632936]]
[[ 0.55479463 0.08531445 0.65312091]
[ 0.08531445 0.13484603 -0.11102433]
[ 0.65312091 -0.11102433 1.13621241]]
y.dot(y) # ๋ฒกํฐ y์ ์์ ์ฌ์ด์ ๋ด์ (dot product)์ ๊ณ์ฐ
# ๋ฒกํฐ y์ ์์ ์ฌ์ด์ ๋ด์ (dot product)์ ๊ณ์ฐ
0.09250029216474008
import numpy as np
# 5x3 ์ฐจ์์ ๋๋ค ํ๋ ฌ X ์์ฑ
X = np.random.randn(5, 3)
print(X)
# X^T * X๋ฅผ ๊ณ์ฐํ์ฌ C์ ํ ๋นํฉ๋๋ค. ์ด ๊ฒฐ๊ณผ๋ 3x3 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ๋ ฌ์
๋๋ค.
C = X.T.dot(X)
print("C = X^T * X:\\n", C)
# C์ ์ญํ๋ ฌ์ ๊ณ์ฐํฉ๋๋ค. -> X * X**-1 = I
invC = np.linalg.inv(C)
print("C์ ์ญํ๋ ฌ:\\n", invC)
# C์ ํ๋ ฌ์(determinant)์ ๊ณ์ฐํฉ๋๋ค.
detC = np.linalg.det(C)
print("C์ ํ๋ ฌ์:", detC)
# C์ ๊ณ ์ ๊ฐ(eigenvalue) S์ ๊ณ ์ ๋ฒกํฐ(eigenvector) U๋ฅผ ๊ณ์ฐํฉ๋๋ค.
S, U = np.linalg.eig(C)
print("C์ ๊ณ ์ ๊ฐ S:\\n", S)
print("C์ ๊ณ ์ ๋ฒกํฐ U:\\n", U)
- X: 5x3 ํฌ๊ธฐ์ ๋๋ค ํ๋ ฌ์ ์์ฑํฉ๋๋ค.
- C: X^T * X ์ฐ์ฐ์ ์ํํ์ฌ ์ ์ฌ๊ฐ ํ๋ ฌ C๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- invC: np.linalg.inv(C)๋ฅผ ์ฌ์ฉํ์ฌ C์ ์ญํ๋ ฌ์ ๊ณ์ฐํฉ๋๋ค.
- detC: np.linalg.det(C)๋ฅผ ์ฌ์ฉํ์ฌ C์ ํ๋ ฌ์์ ๊ณ์ฐํฉ๋๋ค.
- S, U: np.linalg.eig(C)๋ฅผ ์ฌ์ฉํ์ฌ C์ ๊ณ ์ ๊ฐ S์ ๊ณ ์ ๋ฒกํฐ U๋ฅผ ๊ณ์ฐํฉ๋๋ค.
[[ 1.00517715 -0.29554381 -1.29674166]
[ 1.28813155 0.05589876 -0.22072513]
[ 0.46327488 0.5101119 -1.30901555]
[-0.68836097 0.50845609 -0.06891248]
[-0.79042016 1.3979979 -1.01016794]]
C = X^T * X:
[[ 3.98289246 -1.44375394 -1.34831834]
[-1.44375394 2.56361068 -1.74409033]
[-1.34831834 -1.74409033 4.46896842]]
C์ ์ญํ๋ ฌ:
[[0.6600184 0.69051673 0.46861787]
[0.69051673 1.25350588 0.69753544]
[0.46861787 0.69753544 0.63737548]]
C์ ํ๋ ฌ์: 12.749408257332224
C์ ๊ณ ์ ๊ฐ S:
[0.46098261 4.83874418 5.71574477]
C์ ๊ณ ์ ๋ฒกํฐ U:
[[ 0.48384751 0.75707829 -0.43900347]
[ 0.73115789 -0.6253672 -0.27262429]
[ 0.4809363 0.18907227 0.85612613]]
import numpy as np
# 2x2 ํฌ๊ธฐ์ ํ๋ ฌ L์ ์ด๊ธฐํํฉ๋๋ค.
L = np.array([[2, 0], [0, 1]])
# ํ๋ ฌ L์ ๊ณ ์ ๊ฐ(eigenvalue) S์ ๊ณ ์ ๋ฒกํฐ(eigenvector) U๋ฅผ ๊ณ์ฐํฉ๋๋ค.
S, U = np.linalg.eig(L)
# ๊ณ์ฐ๋ ๊ณ ์ ๊ฐ S์ ๊ณ ์ ๋ฒกํฐ U๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
print("๊ณ ์ ๊ฐ S:", S)
print("๊ณ ์ ๋ฒกํฐ U:\\n", U)
๊ณ ์ ๊ฐ S: [2. 1.]
๊ณ ์ ๋ฒกํฐ U:
[[1. 0.]
[0. 1.]]
v = np.array([1,1])
v = L.dot(v)
v
# array([2, 1])
- L.dot(v)์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- L.dot(v) = np.array([21 + 01, 01 + 11]), ์ฆ np.array([2,1])์ ๋๋ค.
The Frobenius norm (ํ๋ก๋ฒ ๋์ฐ์ค ๊ท๋ฒ)
ํ๋ก๋ฒ ๋์ฐ์ค ๊ท๋ฒ(Frobenius norm)์ ํ๋ ฌ์ ์์๋ค์ ๋ํ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ์ ์ ์ฌํ ๊ฐ๋ ์ผ๋ก, ํ๋ ฌ์ ํฌ๊ธฐ๋ ๊ธธ์ด๋ฅผ ์ธก์ ํ๋ ํ๋์ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ด๋ ํ๋ ฌ์ ๊ฐ ์์์ ์ ๊ณฑ์ ํฉํ ๋ค, ๊ทธ ํฉ์ ์ ๊ณฑ๊ทผ์ ์ทจํ ๊ฐ์ผ๋ก ์ ์๋ฉ๋๋ค.
# 1์ฐจ์ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
X = np.array([1, 2])
# 2-๋
ธ๋ฆ(Euclidean norm)์ ๊ณ์ฐํฉ๋๋ค.
# ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ก, ๋ฐฐ์ด์ ๋ชจ๋ ์์์ ์ ๊ณฑ์ ๋ํ๊ณ ๊ทธ ์ ๊ณฑ๊ทผ์ ์ทจํฉ๋๋ค.
print(np.linalg.norm(X)) # ๊ฒฐ๊ณผ: sqrt(1^2 + 2^2) = sqrt(5)
# 1-๋
ธ๋ฆ(Manhattan norm)์ ๊ณ์ฐํฉ๋๋ค.
# ๋ฐฐ์ด์ ๋ชจ๋ ์์์ ์ ๋๊ฐ์ ํฉ์ฐํฉ๋๋ค.
print(np.linalg.norm(X, ord=1)) # ๊ฒฐ๊ณผ: abs(1) + abs(2) = 3
# ๋ฌดํ๋ ๋
ธ๋ฆ(Infinity norm)์ ๊ณ์ฐํฉ๋๋ค.
# ๋ฐฐ์ด์ ๋ชจ๋ ์์ ์ค ๊ฐ์ฅ ํฐ ์ ๋๊ฐ์ ๋ฐํํฉ๋๋ค. -> ์ต๋๊ฐ
print(np.linalg.norm(X, ord=np.inf)) # ๊ฒฐ๊ณผ: max(abs(1), abs(2)) = 2
# -๋ฌดํ๋ ๋
ธ๋ฆ์ ๊ณ์ฐํฉ๋๋ค.
# ๋ฐฐ์ด์ ๋ชจ๋ ์์ ์ค ๊ฐ์ฅ ์์ ์ ๋๊ฐ์ ๋ฐํํฉ๋๋ค. -> ์ต์๊ฐ
print(np.linalg.norm(X, ord=-np.inf)) # ๊ฒฐ๊ณผ: min(abs(1), abs(2)) = 1
2.23606797749979
3.0
2.0
1.0
import math
import numpy as np
# ๋ ๊ฐ์ ๋ฒกํฐ x์ y๋ฅผ ์ ์ํฉ๋๋ค.
x = np.array([1, 0]) # ๋ฒกํฐ x๋ [1, 0]์
๋๋ค.
y = np.array([0, 1]) # ๋ฒกํฐ y๋ [0, 1]์
๋๋ค.
# ์ฒซ ๋ฒ์งธ ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ:
# ๋ฒกํฐ x์ y์ ๋ด์ ์ ๊ณ์ฐํ๊ณ , ๊ฐ ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ ๋ค์, ๋์ ๋๋๋๋ค.
print("cosine =", x.dot(y) / (math.sqrt(x.dot(x)) * math.sqrt(y.dot(y))))
# ๋ ๋ฒ์งธ ์ฝ์ฌ์ธ ์ ์ฌ๋ ๊ณ์ฐ:
# ๋ฒกํฐ x์ y์ ๋ด์ ์ ๊ณ์ฐํ๊ณ , numpy์ np.linalg.norm ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒกํฐ ํฌ๊ธฐ๋ฅผ ๊ณ์ฐํ ๋ค์, ๋์ ๋๋๋๋ค.
print("cosine =", x.dot(y) / (np.linalg.norm(x) * np.linalg.norm(y)))
cosine = 0.0
cosine = 0.0
LAB: distance matrix
- In case of 1-d points
import numpy as np
pts = np.array([1., 2, 3, 4, 5]) # 1์ฐจ์ ๋ฐฐ์ด์ ์์ฑํฉ๋๋ค.
# np.newaxis: ์ถ ํ๋ ๋ ๋ง๋ฌ
u = pts[:, np.newaxis] # ์ด ๋ฐฉํฅ์ผ๋ก 1์ฐจ์ ๋ฐฐ์ด์ ํ์ฅํฉ๋๋ค. ๊ฒฐ๊ณผ๋ (5, 1) ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด์
๋๋ค.
v = pts.T[np.newaxis, :] # ํ ๋ฐฉํฅ์ผ๋ก 1์ฐจ์ ๋ฐฐ์ด์ ํ์ฅํฉ๋๋ค. ๊ฒฐ๊ณผ๋ (1, 5) ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด์
๋๋ค.
# `u`์ `v`์ ์ฐจ์ด์ ์ ๋๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
result = np.abs(u - v)
print(result) # `u`์ `v`์ ์ฐจ์ด์ ์ ๋๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง 5x5 ํ๋ ฌ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
# ๋์นญ ํ๋ ฌ
array([[0., 1., 2., 3., 4.],
[1., 0., 1., 2., 3.],
[2., 1., 0., 1., 2.],
[3., 2., 1., 0., 1.],
[4., 3., 2., 1., 0.]])
- pts.T๋ pts ๋ฐฐ์ด์ ์ ์น(transpose)๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ ์น๋ ๋ฐฐ์ด์ ์ถ(axis)์ ๋ฐ๊พธ๋ ์ฐ์ฐ์ผ๋ก, ๋ฐฐ์ด์ ํ๊ณผ ์ด์ ๋ฐ๊พธ๋ ์ญํ ์ ํฉ๋๋ค.
# pts = np.array([1., 2, 3, 4, 5])
pts.T
# array([1., 2., 3., 4., 5.])
- n-d ํฌ์ธํธ์ธ ๊ฒฝ์ฐ
import numpy as np
# 2์ฐจ์ ๋ฐฐ์ด `pts`๋ฅผ ์ด๊ธฐํํฉ๋๋ค. (3, 2)์ ๋ชจ์์ผ๋ก 2์ฐจ์ ์ ๋ค์ ๋ํ๋
๋๋ค.
pts = np.array([[1, 0], [1, 1], [0, 1]])
# `pts`์ ๋ชจ์์ ์ถ๋ ฅํฉ๋๋ค.
print(pts.shape)
# ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํ์ฌ 3์ฐจ์ ๋ฐฐ์ด `u`๋ฅผ ์์ฑํฉ๋๋ค.
# `u`์ ๋ชจ์์ (3, 2, 1)์ด๋ฉฐ, `pts`์ ๊ฐ ํ์ ์๋ก์ด ์ธ ๋ฒ์งธ ์ฐจ์์ ๋ฐ๋ผ 1์ฐจ์ ๋ฐฐ์ด๋ก ํ์ฅํฉ๋๋ค.
u = pts[:, :, np.newaxis]
# `pts`๋ฅผ ์ ์นํ๊ณ ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํ์ฌ 3์ฐจ์ ๋ฐฐ์ด `v`๋ฅผ ์์ฑํฉ๋๋ค.
# `v`์ ๋ชจ์์ (1, 2, 3)์ด๋ฉฐ, `pts`์ ๊ฐ ์ด์ ์๋ก์ด ์ฒซ ๋ฒ์งธ ์ฐจ์์ ๋ฐ๋ผ 1์ฐจ์ ๋ฐฐ์ด๋ก ํ์ฅํฉ๋๋ค.
v = pts.T[np.newaxis, :, :]
# Result: (3,2)
import numpy as np
# 2์ฐจ์ ์ ๋ค์ ๋ฐฐ์ด `pts`๋ฅผ ์ด๊ธฐํํฉ๋๋ค. `pts`๋ (3, 2) ๋ชจ์์ ๋ฐฐ์ด์
๋๋ค.
pts = np.array([[0, 0], [1, 1], [0, 0]])
# `pts`์ ๋ชจ์์ ์ถ๋ ฅํฉ๋๋ค.
print(pts.shape)
# `pts`์ ๊ฐ ํ์ ์๋ก์ด ์ฐจ์์ ๋ฐ๋ผ ํ์ฅํ์ฌ 3์ฐจ์ ๋ฐฐ์ด `u`๋ฅผ ์์ฑํฉ๋๋ค.
# `u`์ ๋ชจ์์ (3, 2, 1)์
๋๋ค.
u = pts[:, :, np.newaxis]
# `pts`๋ฅผ ์ ์นํ ํ, ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํ์ฌ 3์ฐจ์ ๋ฐฐ์ด `v`๋ฅผ ์์ฑํฉ๋๋ค.
# `v`์ ๋ชจ์์ (1, 2, 3)์ด๋ฉฐ, `pts`์ ๊ฐ ์ด์ ์๋ก์ด ์ฐจ์์ ๋ฐ๋ผ ํ์ฅํ ๊ฒ์
๋๋ค.
v = pts.T[np.newaxis, :, :]
# Result: (3,2)
# np.linalg.norm(pts)๋ ์ฃผ์ด์ง ๋ฐฐ์ด pts์ ๋
ธ๋ฆ(norm)์ ๊ณ์ฐํ๋ ํจ์.
# ๋
ธ๋ฆ์ ์ฃผ์ด์ง ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์ฒ๋
np.linalg.norm(pts)
# 1.4142135623730951
- u = pts[:, :, np.newaxis]์ ์ ๋ ฅ ๋ฐฐ์ด pts๋ฅผ ์๋ก์ด ์ฐจ์์ผ๋ก ํ์ฅํ์ฌ (3, 2, 1) ํ์์ ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค.
- v = pts.T[np.newaxis, :, :]์ pts์ ์ ์น ๋ฐฐ์ด์ ์๋ก์ด ์ฐจ์์ผ๋ก ํ์ฅํ์ฌ (1, 2, 3) ํ์์ ๋ฐฐ์ด๋ก ๋ณํํฉ๋๋ค.
print(v.shape)
print(u.shape)
(1, 2, 3)
(3, 2, 1)
np.sqrt(np.sum((u - v)**2, axis=1))
- ๋ฐฐ์ด u์ v:
- u์ v๋ ๊ฐ๊ฐ (3, 2, 1) ๋ฐ (1, 2, 3) ํ์์ 3์ฐจ์ ๋ฐฐ์ด์ ๋๋ค.
- u๋ pts ๋ฐฐ์ด์ ๊ฐ ์ ์ z ์ถ(๋ง์ง๋ง ์ฐจ์)์ ๋ฐฐ์ดํ์ฌ 3์ฐจ์ ๋ฐฐ์ด๋ก ๋ง๋ ๊ฒ์ ๋๋ค.
- v๋ pts ๋ฐฐ์ด์ ์ ์น(transpose) ํ ์๋ก์ด ์ฐจ์์ ์ถ๊ฐํ์ฌ x ์ถ(์ฒซ ๋ฒ์งธ ์ฐจ์)์ ๋ฐฐ์ดํ ๊ฒ์ ๋๋ค.
- u - v:
- u์ v์ ํ์์ด ๊ฐ๊ฐ (3, 2, 1) ๋ฐ (1, 2, 3)์ด๋ฏ๋ก, ๋ ๋ฐฐ์ด์ ๋ธ๋ก๋์บ์คํ ์ ํตํด ํ์์ด ๋ง์ถฐ์ง๋๋ค.
- u - v๋ ๊ฐ๊ฐ์ u ์์์ v ์์ ๊ฐ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด ์ฐ์ฐ์ ๊ฐ ์ ์ ์ขํ ์ฐจ์ด๋ฅผ ๋ํ๋ ๋๋ค.
- ๊ฒฐ๊ณผ๋ (3, 2, 3) ํ์์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค. ์ด๋ 3๊ฐ์ ์ (u)๊ณผ 3๊ฐ์ ์ (v) ์ฌ์ด์ ์ฐจ์ด ๊ฐ์ ๋ํ๋ ๋๋ค.
- np.sum((u - v)**2, axis=1):
- axis=1์ ์ง์ ํ๋ฉด u์ v ๊ฐ์ ์ฐจ์ด ์ ๊ณฑ์ y ์ถ(๋ ๋ฒ์งธ ์ฐจ์)์์ ํฉ์ฐํฉ๋๋ค.
- axis=1์ ํฉ์ฐ ๊ฒฐ๊ณผ๋ (3, 3) ํ์์ ๋ฐฐ์ด๋ก, ๊ฐ ์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ๋ ๋๋ค.
- np.sqrt(np.sum((u - v)**2, axis=1)):
- u์ v์ ๊ฐ ์ ๊ฐ ์ฐจ์ด์ ์ ๊ณฑ์ ํฉ์ฐํ ๊ฐ์ sqrt๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ณฑ๊ทผ์ ๊ณ์ฐํฉ๋๋ค.
- ์ด ์ฐ์ฐ์ 3๊ฐ์ ์ ๊ฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ (3, 3) ํ์์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
array([[0. , 1. , 1.41421356],
[1. , 0. , 1. ],
[1.41421356, 1. , 0. ]])
- np.linalg.norm(u - v, axis=1)๋ u์ v ์ฌ์ด์ ์ฐจ์ด ๋ฒกํฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ(Euclidean distance)๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋์
๋๋ค.
- u์ v๋ ๊ฐ๊ฐ (3, 2, 1)๊ณผ (1, 2, 3)์ ํ์์ ๊ฐ์ง NumPy ๋ฐฐ์ด๋ก, ๊ฐ๊ฐ 2์ฐจ์ ํฌ์ธํธ๋ฅผ ํํํฉ๋๋ค. u์ v๋ ์๋ก ๋ค๋ฅธ ํ์์ด์ง๋ง, ๋ธ๋ก๋์บ์คํ ์ ํตํด ๋ ๋ฐฐ์ด์ ์ฐ์ฐํ ์ ์์ต๋๋ค.
- u - v๋ u ๋ฐฐ์ด๊ณผ v ๋ฐฐ์ด์ ์ฐจ์ด ๋ฒกํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๋ ๋ฐฐ์ด์ ๋ธ๋ก๋์บ์คํ ์ ํตํด (3, 2, 3) ํ์์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ์ด๋ u์ v ์ฌ์ด์ ์ฐจ์ด๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด์ ๋๋ค.
- np.linalg.norm(u - v, axis=1)์ ์ฐจ์ด ๋ฒกํฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค. axis=1์ ํ ๋จ์๋ก ์ฐ์ฐ์ ์ํํ๋๋ก ์ง์ํฉ๋๋ค. ์ฆ, ๊ฐ ํฌ์ธํธ u์ v ์ฌ์ด์ ์ฐจ์ด ๋ฒกํฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
np.linalg.norm(u - v, axis=1)
np.linalg.norm(u - v, axis=1)
array([[0. , 1. , 1.41421356],
[1. , 0. , 1. ],
[1.41421356, 1. , 0. ]])
์ค์ ์์ฉ ํ๋ก๊ทธ๋จ์์ sklearn.metrics.pairwise๋ฅผ ์ฌ์ฉํ์ฌ ์๋ณ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค
- euclidean_distances(pts): pts ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ ๋ ์ ์ฌ์ด์ ์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ฐํ๋๋ ๊ฐ์ pts ๋ฐฐ์ด์ ๊ฐ ์์ ๋ํ ๊ฑฐ๋ฆฌ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ํ๋ ฌ์ ๋๋ค.
- manhattan_distances(pts): pts ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ ๋งจํดํผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ๋งจํดํผ ๊ฑฐ๋ฆฌ๋ ๋ ์ ์ฌ์ด์ ์ขํ ์ฐจ์ด์ ์ ๋๊ฐ์ ํฉํ ๊ฐ์ผ๋ก, ํ์ ๊ฑฐ๋ฆฌ๋ผ๊ณ ๋ ๋ถ๋ฆฝ๋๋ค. ๋ฐํ๋๋ ๊ฐ์ pts ๋ฐฐ์ด์ ๊ฐ ์์ ๋ํ ๊ฑฐ๋ฆฌ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ํ๋ ฌ์ ๋๋ค.
- cosine_similarity(pts): pts ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ฝ์ฌ์ธ ์ ์ฌ๋๋ ๋ ๋ฒกํฐ ์ฌ์ด์ ๊ฐ๋๋ฅผ ๋ํ๋ด๋ฉฐ, 1์ ๊ฐ๊น์ธ์๋ก ์ ์ฌํ ๋ฐฉํฅ์ ๊ฐ์ง๊ณ ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐํ๋๋ ๊ฐ์ pts ๋ฐฐ์ด์ ๊ฐ ์์ ๋ํ ์ ์ฌ๋ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ ํ๋ ฌ์ ๋๋ค.
from sklearn.metrics.pairwise import euclidean_distances, manhattan_distances, cosine_similarity
# 2์ฐจ์ ํฌ์ธํธ ๋ฐฐ์ด `pts`์ ์์๋ค ๊ฐ์ ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
print(euclidean_distances(pts))
# 2์ฐจ์ ํฌ์ธํธ ๋ฐฐ์ด `pts`์ ์์๋ค ๊ฐ์ ๋งจํดํผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
print(manhattan_distances(pts))
# 2์ฐจ์ ํฌ์ธํธ ๋ฐฐ์ด `pts`์ ์์๋ค ๊ฐ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํฉ๋๋ค.
print(cosine_similarity(pts))
[[0. 1. 1.41421356]
[1. 0. 1. ]
[1.41421356 1. 0. ]]
[[0. 1. 2.]
[1. 0. 1.]
[2. 1. 0.]]
[[1. 0.70710678 0. ]
[0.70710678 1. 0.70710678]
[0. 0.70710678 1. ]]
์ด์ ์ฌ๊ธฐ์ ์์ ์ ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ํ๋ ค๋ฉด?
- ์ด ์ฝ๋๋ pairwise_distances ํจ์๋ฅผ ์ฌ์ฉํ์ฌ pts ๋ฐฐ์ด์ ๊ฐ ์์ ๊ฐ์ ๋ฌดํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- inf_dist ํจ์๋ ๋ ๋ฒกํฐ x์ y ์ฌ์ด์ ๊ฐ ์์ ๊ฐ ์ ๋ ์ฐจ์ด์ ์ต๋๊ฐ์ ๋ฐํํ๋ ๋๋ค ํจ์์ ๋๋ค.
- pairwise_distances(pts, metric=inf_dist)๋ ์ฃผ์ด์ง pts ๋ฐฐ์ด์ ๊ฐ ์์ ๋ํ ๋ฌดํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ์ฌ ํ๋ ฌ๋ก ๋ฐํํฉ๋๋ค.
from sklearn.metrics.pairwise import pairwise_distances
# ์ฌ์ฉ์ ์ ์ ๊ฑฐ๋ฆฌ ํจ์ inf_dist๋ ๋ ์ x์ y ์ฌ์ด์ ๋ฌดํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
# ๋ฌดํ๋ ๊ฑฐ๋ฆฌ(inf_dist)๋ ๋ ๋ฒกํฐ x์ y์ ๊ฐ ์์ ๊ฐ ์ ๋ ์ฐจ์ด์ ์ต๋๊ฐ์ ์๋ฏธํฉ๋๋ค.
inf_dist = lambda x, y : np.max(np.abs(x - y))
# pairwise_distances ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง 2์ฐจ์ ํฌ์ธํธ ๋ฐฐ์ด pts์ ๊ฐ ์์ ๋ํ ๋ฌดํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
# metric ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ์ ์ ์ ๊ฑฐ๋ฆฌ ํจ์ inf_dist๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌดํ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํฉ๋๋ค.
print(pairwise_distances(pts, metric=inf_dist))
[[0. 1. 1.]
[1. 0. 1.]
[1. 1. 0.]]
๋ฐ์ํ
'๐ Data Mining' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Data Mining] Statistics (ํต๊ณํ) (0) | 2024.07.14 |
---|---|
[Data Mining] Linear Algebra (์ ํ๋์) (0) | 2024.07.09 |
[Data Mining] Introduction to Numpy part.1 (0) | 2024.06.26 |
[Data Mining] Visualizing Data (0) | 2024.06.25 |
[Data Mining] Crash_Course in Python Part.2 (0) | 2024.06.25 |