๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ธ๊ณต์ง€๋Šฅ

[Day 6] Math for AI - 1. numpy

๐Ÿ“ Numerical Python - numpy

    - '๋‹ค์–‘ํ•œ ํ–‰๋ ฌ๊ณผ ๊ทธ ๊ณ„์‚ฐ์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?' ๋ผ๋Š” ๊ณ ๋ฏผ์—์„œ ์‹œ์ž‘๋˜์–ด numpy๋ผ๋Š” ๋ชจ๋“ˆ์ด ํƒ„์ƒ

    - ๊ณ ์„ฑ๋Šฅ ๊ณผํ•™ ๊ณ„์‚ฐ์šฉ ํŒจํ‚ค์ง€๋กœ ๊ณตํ•™, ์ดํ•™, ์ฆ๊ถŒ ๋“ฑ์˜ ๋ถ„์•ผ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋จ

    - Maxtrix์™€ Vector์™€ ๊ฐ™์€ Array ์—ฐ์‚ฐ์˜ ์‚ฌ์‹ค์ƒ ํ‘œ์ค€

  ๐Ÿ”ฅ ํŠน์ง•

    1. ๋น ๋ฅด๊ณ , ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ 

    2. ๋ฐ˜๋ณต๋ฌธ์—†์ด ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•จ.

    3. ์„ ํ˜• ๋Œ€์ˆ˜์™€ ๊ด€๋ จ๋œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

    4. ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  numpy๋ชจ๋“ˆ์„ ์„ค์น˜ํ•ด์•ผ ํ•จ.(ex. in conda, conda install numpy) - ์ผ๋ฐ˜์ ์œผ๋กœ np๋ผ๋Š” alias์‚ฌ์šฉ

 

  ๐Ÿ”ฅ ndarray

    - ๋ณดํ†ต array๋ผ๊ณ  ๋ถ€๋ฆ„ - numpy์—์„œ ์ง€์›ํ•˜๋Š” array๋กœ np.array(List์ด๋ฆ„, dtype(๋ฐ์ดํ„ฐํƒ€์ž…)) ์œผ๋กœ ์“ฐ์ด๊ณ  ndarray๊ฐ์ฒด๋ผ ๋ถˆ๋ฆผ

    - List์™€ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ์ง€์›ํ•จ -> Dynamic Typing ์ง€์› ํ•˜์ง€ ์•Š๋Š”๋‹ค!!

    -> List๋Š” ์ฃผ์†Œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ์— ๋ณ€๊ฒฝ์— ์žˆ์–ด์„œ๋Š” ์ด์ ์ด ์žˆ์ง€๋งŒ, ์—ฐ์‚ฐ์„ ํ• ๋•Œ์—๋Š” numpy์˜ ๊ฒฝ์šฐ๊ฐ€ ์ข‹๋‹ค

    -> numpy์˜ ๊ฒฝ์šฐ๋Š” ๊ฐ’๋“ค์ด ๋‹ค ๋ถ™์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฐ์‚ฐ์ด ๋” ๋น ๋ฆ„, ๋ฉ”๋ชจ๋ฆฌ์˜ ์ ‘๊ทผ์„ฑ์ด ๋†’๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ ๊ณต๊ฐ„์„ ์ •ํ•˜๊ธฐ ์šฉ์˜ํ•˜๋‹ค.

    - shape(): numpy array์˜ dimension ๊ตฌ์„ฑ(ํฌ๊ธฐ, ํ˜•ํƒœ)๋ฅผ ๋ฐ˜ํ™˜ํ•จ - 3x4ํ–‰๋ ฌ์ด๋ผ๋ฉด (3, 4)๋ฅผ ๋ฐ˜ํ™˜

    - dtype(): numpy array์˜ ๋ฐ์ดํ„ฐ type๋ฅผ ๋ฐ˜ํ™˜(int, float ๋“ฑ)

    - Array์˜ Rank(์ฐจ์›)์— ๋”ฐ๋ผ ๋ถˆ๋ฆฌ๋Š” ์ด๋ฆ„์ด ๋‹ค๋ฆ„

      -> RANK0: scalar    /    RANK1: Vector    /    RANK2: Matrix    /    RANK3: 3-tensor    /    RANKn: n-tensor

 

๐Ÿ“ Handling Shape

  ๐Ÿ”ฅ reshape(): Array์˜ shape์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•จ, elements์˜ ๊ฐฏ์ˆ˜๋Š” ๋™์ผ

    ex. (4,2) -> (8, )์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” np.array(a).reshape(8, )์œผ๋กœ ํ•ด์ฃผ๋ฉด ๋ณ€๊ฒฝ.

    - reshape์—์„œ -1์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ด ์ฑ„์›Œ์ฃผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ

    ex. np.array(a).reshape(2, -1) ์„ ํ•˜๊ฒŒ๋˜๋ฉด (2, 4) shape์„ ๊ฐ€์ง€๋Š” array๋กœ ๋ฐ˜ํ™˜

    - flatten(): ๋‹ค์ฐจ์› Array๋ฅผ 1์ฐจ์› Array๋กœ ๋ณ€๊ฒฝ

 

  ๐Ÿ”ฅ Indexing and Slicing

    - index: List์™€ ๋‹ฌ๋ฆฌ [x, y]๋กœ ํ‘œ๊ธฐ ๊ฐ€๋Šฅ -> test_list[x][y] = test_list[x, y]

               Matrix์˜ ๊ฒฝ์šฐ [row, column]์ˆœ

 

    - slicing: List์™€ ๋‹ฌ๋ฆฌ ํ–‰๊ณผ ์—ด ๋ถ€๋ถ„์„ ๋‚˜๋ˆ ์„œ Slicing ๊ฐ€๋Šฅ

                Matrix์˜ ๋ถ€๋ถ„ ์ง‘ํ•ฉ ์ถ”์ถœ์‹œ ์œ ์šฉ

    ex. a = np.array([[1,2,3,4,5], [6,7,8,9,10]], int)

          -> a[:, 2:]  ==> ์ „์ฒด row์˜ 2 column์ด์ƒ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ  = [[3,4,5], [8,9,10]]

          -> a[1, 1:3] ==> 1 row์˜ 1, 2 column  = [7, 8]

          -> a[1:3]  ==>  1, 2 row ์ „์ฒด, But ์ธ๋ฑ์Šค๊ฐ€ ๋„˜์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— Error

 

    - arange(): array์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•ด ๊ฐ’์„ ์ƒ์„ฑํ•œ list ์ƒ์„ฑ

    ex. np.arange(30) -> 0~29๊นŒ์ง€ list ์ƒ์„ฑ

         np.arange(0, 5, 0.5) -> [0, 0.5, 1, 1.5 ...] list ์ƒ์„ฑ

         np.arange(30).reshape(5,6) -> 2์ฐจ์› list๋กœ 0~29๊นŒ์ง€ ์ƒ์„ฑ

 

    - Zeros: 0์œผ๋กœ ๊ฐ€๋“์ฐฌ array -> np.zeros(shape = (5, ), dtype = np.int) -> [0, 0, 0, 0, 0]

    - Ones: 1๋กœ ๊ฐ€๋“์ฐฌ array -> np.ones(shape = (5,), dtype = np.int) -> [1, 1, 1, 1, 1]

    - empy: ๊ฐ’์ด ์—†๋Š” array ์ƒ์„ฑ(Memory initialization ๋˜์ง€ ์•Š์Œ)

    - something_like: ์›๋ž˜ ์žˆ๋Š” array์˜ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ 0, 1, empty array๋ฅผ ์ƒ์„ฑ(ex. ones_like(a))

 

  ๐Ÿ”ฅ identity, eye, dia, and random sample

    - identity: ๋‹จ์œ„ ํ–‰๋ ฌ(iํ–‰๋ ฌ)์„ ์ƒ์„ฑ ex) np.identity(n=3, dtype = np.int) -> [[1, 0, 0], [0, 1, 0], [0, 0, 1]]

    - eye: ๋Œ€๊ฐ์„ ์ด 1์ธ ํ–‰๋ ฌ, k๊ฐ’์œผ๋กœ ์‹œ์ž‘ํ•จ(index ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅ)

      ex. np.eye(3, 5, k=2) ==> [[0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]

    - diag: ๋Œ€๊ฐ ํ–‰๋ ฌ์˜ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ํ•จ์ˆ˜

    - random sample: ๋ฐ์ดํ„ฐ ๋ถ„ํฌ์— ๋”ฐ๋ฅธ sampling์œผ๋กœ array ์ƒ์„ฑ

      ex. np.random.uniform(0, 1, 10).reshape(2, 5)  => ๊ท ๋“ฑ๋ถ„ํฌ๋กœ 0~1์‚ฌ์ด์˜ ๊ฐ’์„ ๋žœ๋คํ•˜๊ฒŒ ๋ฝ‘์•„๋ƒ„

      ex. np.random.normal(0, 1, 10).reshape(2, 5)  => ์ •๊ทœ๋ถ„ํฌ๋กœ 0~1์‚ฌ์ด์˜ ๊ฐ’์„ ๋žœ๋คํ•˜๊ฒŒ ๋ฝ‘์•„๋ƒ„

 

  ๐Ÿ”ฅ Operation Functions

    - sum, mean, std: array์˜ ์š”์†Œ(elements)๋“ค์˜ ํ•ฉ, ํ‰๊ท , ํ‘œ์ค€ํŽธ์ฐจ ๋“ฑ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ

      ** axis - ๊ธฐ์ค€์ด ๋˜๋Š” dimension ์ถ•์„ ์ •ํ•  ์ˆ˜ ์žˆ์Œ(Matrix์˜ ๊ฒฝ์šฐ 0 - row, 1 - column)

 

    - Concatenate: numpy array๋ฅผ ํ•ฉ์น˜๋Š”(๋ถ™์ด๋Š”) ํ•จ์ˆ˜(vstack, hstack, concatenate)

axis๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

    - numpy์—์„œ๋Š” array๊ฐ„์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์น™์—ฐ์‚ฐ์„ ์ œ๊ณต

    - Element-wise operations: array๊ฐ„ shape๊ฐ€ ๊ฐ™์„ ๋•Œ๋Š” ๊ฐ™์€ ์ธ๋ฑ์Šค์˜ ์š”์†Œ๋ผ๋ฆฌ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•จ.

 

    - Dot prduct: Matrix์˜ ๊ธฐ๋ณธ ์—ฐ์‚ฐ, dotํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

 

    - Transpose: ์ „์น˜ํ–‰๋ ฌ(T)์œผ๋กœ transposeํ•จ์ˆ˜๋‚˜ T๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ

 

    - Broadcasting: shape์ด ๋‹ค๋ฅธ ๋ฐฐ์—ด ๊ฐ„์˜ ์—ฐ์‚ฐ์„ ์ง€์›ํ•จ.

 

  ๐Ÿ”ฅ Comparisons

    - All & any: Array์˜ ๋ฐ์ดํ„ฐ ์ „๋ถ€(all) ๋˜๋Š” ์ผ๋ถ€(any)๊ฐ€ ์กฐ๊ฑด์— ๋งŒ์กฑํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜(True / False list)

      ex. a = [1, 2, 3, 4, 5]   a > 3    ==>    array([False, False, False, True, True]) ๋ฐ˜ํ™˜

           np.any(a<3) => True    np.all(a>3)  => False

 

    - np.where() => where(์กฐ๊ฑด, True์‹œ ๋ฐ˜ํ™˜ ๊ฐ’, False์‹œ ๋ฐ˜ํ™˜ ๊ฐ’)

      ex. np.where(a < 3, 2, 3)  ==>  [2, 2, 3, 3, 3] ๋ฐ˜ํ™˜

      -> ๊ทธ ์™ธ์— index๊ฐ’์„ ๋ฐ˜ํ™˜(True์ธ index), isnan(none ๊ฐ’ ์ฐพ๊ธฐ), isfinite(finite number)๋“ฑ์ด ์žˆ์Œ

 

    - argmax & argmin: array๋‚ด์˜ ์ตœ๋Œ€๊ฐ’ ๋˜๋Š” ์ตœ์†Œ๊ฐ’์˜ index ๋ฐ˜ํ™˜ -> axis ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ˜ํ™˜ ๊ฐ€๋Šฅ

    - argsort(): ์ •๋ ฌ ํ•œ index๋ฅผ ๋ฐ˜ํ™˜

    - boolean index: ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๊ฐ’์„ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ถ”์ถœ - Shape๊ฐ€ ์ค‘์š”!!

    - fancy index: numpy๋Š” array๋ฅผ index value๋กœ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’ ์ถ”์ถœ - index ๋ฒ”์œ„๊ฐ€ ์ค‘์š”!!

      ex. a = [1., 2., 3., 4., 5.]     b = [0, 0, 1, 2, 3, 4, 1, 1]

            a[b] = a.take(b)   ==>  [1., 1., 2., 3., 4., 5., 2., 2.]๊ฐ€ ๋ฐ˜ํ™˜

       => matrix ํ˜•ํƒœ๋„ ๊ฐ€๋Šฅ(a[b, c])

 

    - numpy I/O: loadtxt & savetxt: text type์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ €์žฅ

      ex. a = np.loadtxt("./test.txt", delimiter = "\t")

          np.savetxt("a_test.csv", a, fmt = "%.2e", delimiter = ',')

                       npyํ˜•ํƒœ์˜ ํŒŒ์ผ๋กœ๋„ ์ฝ๊ณ , ์ €์žฅ ๊ฐ€๋Šฅ(pickleํ˜•ํƒœ)

      ex. np.save("npy_test", arr = a)   ==>  npy_test.npy ํŒŒ์ผ ์ƒ์„ฑ

          a_test = np.load(file = "npy_test.npy")

'์ธ๊ณต์ง€๋Šฅ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Day 7] Math for AI - Gradient Descent  (0) 2021.01.26
[Day 6] Math for AI - 2. Vector and Matrix  (0) 2021.01.25
[Day 5] Python  (2) 2021.01.22
[Day 4] Python  (0) 2021.01.21
[Day 3] Python  (0) 2021.01.20