λ°μν
Linear Algebra
Linear Algebra (μ νλμν)μ λ²‘ν° κ³΅κ°, νλ ¬, μ ν λ³ν λ±μ κ°λ μ μ°κ΅¬νλ μνμ ν λΆμΌμ λλ€
- μ£Όλ‘ λ€μ°¨μ 곡κ°μμμ 벑ν°μ νλ ¬μ μ°μ° λ° μ΄λ€ κ°μ κ΄κ³λ₯Ό λ€λ£¨λ©°, 곡ν, 물리ν, μ»΄ν¨ν° κ³Όν λ± λ€μν λΆμΌμμ μ€μν μν μ ν©λλ€.
- λν λ§μ λ°μ΄ν° κ³Όν κ°λ κ³Ό κΈ°μ μ λ·λ°μΉ¨ν©λλ€.
import re, math, random # regexes, math functions, random numbers
import matplotlib.pyplot as plt # pyplot
from collections import defaultdict, Counter
from functools import partial, reduce
Vectors
Vectorsλ μ΄λ€ finite-dimensional 곡κ°μ μλ μ μ λλ€.
- λ°μ΄ν°λ₯Ό 벑ν°λ‘ μκ°ν©λλ€
- numeric(μ«μ) λ°μ΄ν°λ₯Ό λνλ΄λ μ’μ λ°©λ² μ λλ€.
- 3μ°¨μ 벑ν°(ν€, λͺΈλ¬΄κ², λμ΄)
- 4μ°¨μ 벑ν°λ‘μμ νμμ±μ (μν1, μν2, μν3, μν4)
- 3μ°¨μ 곡κ°μ 벑ν°μ ν΄λΉνλ 3κ°μ μ«μ λͺ©λ‘
height_weight_age = [70, # inches,
170, # pounds,
40 ] # years
grades = [95, # exam1
80, # exam2
75, # exam3
62 ] # exam4
Vectorμ κ΄ν Arithmetic(μ°μ )
λ²‘ν° μ°μ°μ μ μν©λλ€
- μ΄ νμ΄μ¬ μ½λλ€μ μ€λͺ μ μν μνμ μ μλ‘ μμν΄ λ³΄μμμ€
- λͺ©λ‘μ μ±λ₯μ΄ ννΈμμ΅λλ€
- λμ©λ λ°μ΄ν°κ° μλ μ€μ μ ν리μΌμ΄μ μμ numpy Arrayλ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
Adding two vectors
# Jupyter Notebookμμ κ·Έλνλ₯Ό μΈλΌμΈ λͺ¨λλ‘ νμνκΈ° μν΄ λ§€μ§ λͺ
λ Ήμ΄λ₯Ό μ¬μ©ν©λλ€.
%matplotlib inline
# νμν λΌμ΄λΈλ¬λ¦¬ κ°μ Έμ€κΈ°
import numpy as np # μ«μ μ°μ°μ μν numpy λΌμ΄λΈλ¬λ¦¬
import matplotlib.pyplot as plt # κ·Έλν μμ±μ μν matplotlib.pyplot
# 5x5 ν¬κΈ°μ κ·Έλν μμ±
plt.figure(figsize=(5, 5))
# xμΆμ 0λΆν° 4κΉμ§, yμΆμ 0λΆν° 4κΉμ§ μ€μ
plt.axis([0, 4, 0, 4])
# λ²‘ν° vμ wλ₯Ό λ°°μ΄λ‘ μ μ
v = np.array([1, 2])
w = np.array([2, 1])
# λ²‘ν° vλ₯Ό νλμ νμ΄νλ‘ νμ
plt.arrow(0, 0, v[0], v[1], head_width=0.05, head_length=0.1, fc='b', ec='b')
# λ²‘ν° wλ₯Ό λ
Ήμ νμ΄νλ‘ νμ
plt.arrow(0, 0, w[0], w[1], head_width=0.05, head_length=0.1, fc='g', ec='g')
# λ²‘ν° v + wλ₯Ό λ
Ήμ νμ΄νλ‘ νμ
# μμμ μ λ²‘ν° vμ λμ μ΄λ©°, κΈΈμ΄λ λ²‘ν° wμ κ°κ³Ό λμΌ
plt.arrow(v[0], v[1], w[0], w[1], head_width=0.05, head_length=0.1, fc='g', ec='g')
# λ²‘ν° v + wλ₯Ό λΉ¨κ°μ νμ΄νλ‘ νμ
plt.arrow(0, 0, v[0] + w[0], v[1] + w[1], head_width=0.2, head_length=0.1, fc='r', ec='r')
# κ° λ²‘ν°μ λμ μ λΌλ²¨μ μΆκ°
offset = np.array([-0.2, -0.2])
plt.annotate('v', xy=v + offset)
plt.annotate('w', xy=w + offset)
plt.annotate('v+w', xy=v + w + offset)
# κ·Έλν νμ
plt.show()
def vector_add(v, w):
"""λ 벑ν°λ₯Ό μμλ³λ‘ λν΄μ£Όλ ν¨μ
맀κ°λ³μ:
v -- 첫 λ²μ§Έ λ²‘ν° (리μ€νΈ νν), w -- λ λ²μ§Έ λ²‘ν° (리μ€νΈ νν)
λ°νκ°:
λ 벑ν°μ κ° μμλ₯Ό λν κ²°κ³Ό λ²‘ν° (리μ€νΈ νν)
"""
# zip ν¨μλ₯Ό μ¬μ©νμ¬ λ 벑ν°μ μμλ₯Ό μμΌλ‘ λ¬Άμ΅λλ€.
# κ° μμ μ v_i, w_iμ λν΄ μμλ³λ‘ λν κ°μ 리μ€νΈλ‘ λ°νν©λλ€.
return [v_i + w_i for v_i, w_i in zip(v, w)]
def vector_subtract(v, w):
"""λ 벑ν°λ₯Ό μμλ³λ‘ λΉΌμ£Όλ ν¨μ
맀κ°λ³μ:
v -- 첫 λ²μ§Έ λ²‘ν° (리μ€νΈ νν) w -- λ λ²μ§Έ λ²‘ν° (리μ€νΈ νν)
λ°νκ°:
λ 벑ν°μ κ° μμλ₯Ό λΊ κ²°κ³Ό λ²‘ν° (리μ€νΈ νν)
"""
# zip ν¨μλ₯Ό μ¬μ©νμ¬ λ 벑ν°μ μμλ₯Ό μμΌλ‘ λ¬Άμ΅λλ€.
# κ° μμ μ v_i, w_iμ λν΄ μμλ³λ‘ λΉΌλ κ°μ 리μ€νΈλ‘ λ°νν©λλ€.
return [v_i - w_i for v_i, w_i in zip(v, w)]
def vector_sum(vectors):
"""벑ν°μ 리μ€νΈλ₯Ό μ
λ ₯λ°μ λͺ¨λ 벑ν°μ μμλ³ ν©μ κ³μ°νλ ν¨μ
맀κ°λ³μ:
vectors -- 벑ν°μ 리μ€νΈ
λ°νκ°:
벑ν°μ μμλ³ ν© (리μ€νΈ νν)
"""
# functools.reduce ν¨μλ₯Ό μ¬μ©νμ¬ `vector_add` ν¨μλ₯Ό νμ©ν΄ 벑ν°λ₯Ό μμλ³λ‘ ν©ν©λλ€.
return reduce(vector_add, vectors)
def scalar_multiply(c, v):
"""μ€μΉΌλΌμ 벑ν°μ μμλ³ κ³±μ κ³μ°νλ ν¨μ
맀κ°λ³μ:
c -- μ€μΉΌλΌ (μ«μν), v -- λ²‘ν° (리μ€νΈ νν)
λ°νκ°:
μ€μΉΌλΌ cμ λ²‘ν° vμ κ° μμλ₯Ό κ³±ν κ²°κ³Ό λ²‘ν° (리μ€νΈ νν)
"""
# λ²‘ν° vμ κ° μμ v_iμ μ€μΉΌλΌ cλ₯Ό κ³±νμ¬ λ¦¬μ€νΈλ‘ λ°νν©λλ€.
return [c * v_i for v_i in v]
def vector_mean(vectors):
"""μ
λ ₯ 벑ν°μ iλ²μ§Έ μμμ νκ· μ κ³μ°νμ¬ μλ‘μ΄ λ²‘ν°λ₯Ό μμ±νλ ν¨μ
맀κ°λ³μ:
vectors -- 벑ν°μ 리μ€νΈ
λ°νκ°:
κ° λ²‘ν°μ μμλ³ νκ· μ κ³μ°νμ¬ μ»μ μλ‘μ΄ λ²‘ν° (리μ€νΈ νν)
"""
n = len(vectors) # 벑ν°μ 리μ€νΈμ μλ 벑ν°μ μ
# 벑ν°λ€μ μμλ³ νκ· μ κ³μ°νκΈ° μν΄ λ¨Όμ 벑ν°μ ν©μ ꡬνκ³ ,
# μ€μΉΌλΌ 1/nμ κ³±νμ¬ νκ· μ ꡬν©λλ€.
return scalar_multiply(1/n, vector_sum(vectors))
Numpy Version
# numpy λ²μ μ λ²‘ν° μ°μ° ν¨μ
import numpy as np
# μΈ κ°μ 벑ν°λ₯Ό μ μν©λλ€.
u = np.array([1,1,1])
v = np.array([1,0,0])
w = np.array([0,1,0])
print(v + w) # λ²‘ν° vμ wλ₯Ό λν©λλ€.
print(v - w) # λ²‘ν° vμμ wλ₯Ό λΊλλ€.
vs = np.array([u, v, w]) # u, v, w μΈ κ°μ 벑ν°λ₯Ό λ¬Άμ λ°°μ΄μ λ§λλλ€.
print(np.sum(vs, axis=0)) # vs λ°°μ΄μ κ° μ΄μ ν©μ κ³μ°ν©λλ€.
# axis=0μ μ¬μ©νλ©΄ κ° λ²‘ν°μ μμλ₯Ό ν©μ³μ νλμ 벑ν°λ‘ λ°νν©λλ€.
print(10 * v) # λ²‘ν° vμ μ€μΉΌλΌ 10μ κ³±ν©λλ€.
print(np.mean(vs, axis=0)) # vs λ°°μ΄μ κ° μ΄μ νκ· μ κ³μ°ν©λλ€.
# axis=0μ μ¬μ©νλ©΄ κ° λ²‘ν°μ μμλ₯Ό ν©μ³μ νλμ 벑ν°λ‘ λ°νν©λλ€.
[1 1 0]
[ 1 -1 0]
[2 2 1]
[10 0 0]
[0.66666667 0.66666667 0.33333333]
def dot(v, w):
"""v_1 * w_1 + ... + v_n * w_n ννμ λ΄μ μ κ³μ°ν©λλ€."""
return sum(v_i * w_i for v_i, w_i in zip(v, w))
def sum_of_squares(v):
"""v_1 * v_1 + ... + v_n * v_n ννμ μ κ³±ν©μ κ³μ°ν©λλ€."""
return dot(v, v)
def magnitude(v):
"""벑ν°μ μ κ³±ν©μ κ³μ°ν ν μ κ³±κ·Όμ ꡬν©λλ€."""
return math.sqrt(sum_of_squares(v))
- dot(v, w) ν¨μλ λ λ²‘ν° vμ wμ λ΄μ μ κ³μ°ν©λλ€. κ° μμ v_iμ w_iμ κ³±μ κ³μ°ν ν λͺ¨λ ν©ν©λλ€.
- sum_of_squares(v) ν¨μλ λ²‘ν° vμ μ κ³±ν©μ κ³μ°ν©λλ€. λ²‘ν° vμ μμ κ³Όμ λ΄μ μ κ³μ°ν©λλ€.
- magnitude(v) ν¨μλ λ²‘ν° vμ ν¬κΈ°λ₯Ό κ³μ°ν©λλ€.
- sum_of_squares(v) ν¨μλ‘ κ³μ°ν μ κ³±ν©μ μ κ³±κ·Όμ κ³μ°νμ¬ λ²‘ν°μ ν¬κΈ°λ₯Ό ꡬν©λλ€.
v = np.array([1,0,0]) # λ²‘ν° vλ₯Ό μ μν©λλ€.
w = np.array([0,1,0]) # λ²‘ν° wλ₯Ό μ μν©λλ€.
print(np.dot(v,w)) # λ²‘ν° vμ wμ λ΄μ
print(v.dot(w)) # λ²‘ν° vμ wμ λ΄μ
print(np.dot(v,v)) # λ²‘ν° vμ μ κ³±ν©
print(np.sqrt(np.dot(v,v))) # λ²‘ν° vμ ν¬κΈ°
print(np.linalg.norm(v)) # λ²‘ν° vμ ν¬κΈ°
0
0
1
1.0
1.0
- np.dot(v, w)μ v.dot(w)λ λ²‘ν° vμ wμ λ΄μ μ κ³μ°ν©λλ€. λ 벑ν°λ μ§κ΅νλ―λ‘ κ²°κ³Όλ 0μ λλ€.
- np.dot(v, v)λ λ²‘ν° vμ κ° μμλ₯Ό μ κ³±ν ν λνμ¬ λ²‘ν° vμ μ κ³±ν©μ κ³μ°ν©λλ€. κ²°κ³Όλ 1μ λλ€.
- np.sqrt(np.dot(v, v))λ λ²‘ν° vμ μ κ³±ν©μ κ³μ°ν ν, μ κ³±κ·Όμ ꡬνμ¬ λ²‘ν° vμ ν¬κΈ°λ₯Ό κ³μ°ν©λλ€. κ²°κ³Όλ 1.0μ λλ€.
- np.linalg.norm(v)λ np.linalg.norm() ν¨μλ₯Ό μ¬μ©νμ¬ λ²‘ν° vμ ν¬κΈ°λ₯Ό κ³μ°ν©λλ€.
- κ²°κ³Όλ 1.0μΌλ‘ np.sqrt(np.dot(v, v))μ κ²°κ³Όμ λμΌν©λλ€.
Vector ProjectionμΌλ‘ Dot Product(μ κ³±)
μ€λͺ → π―'s projection on π°: π―1
- v1 = v⋅w / |w|² * w:
- v1: λ²‘ν° vμ λ²‘ν° wμ λν ν¬μ 벑ν°μ λλ€. μ¦, vκ° λ²‘ν° wμ κ°μ λ°©ν₯μΌλ‘ ν¬μλ 벑ν°μ λλ€.
- v⋅w: λ²‘ν° vμ wμ λ΄μ (dot product)μ λλ€. μ΄λ λ λ²‘ν° μ¬μ΄μ κ°λμ λ°λΌ ν¬κΈ°λ₯Ό κ³μ°ν©λλ€.
- |w|²: λ²‘ν° wμ ν¬κΈ°(μ λκ°)μΈ |w|μ μ κ³±μ λλ€.
- w: λ²‘ν° w μ체μ λλ€.
- μ μμ λ²‘ν° vμ λ²‘ν° wμ λν ν¬μμ κ³μ°ν©λλ€. ν¬μλ λ²‘ν° v1λ λ²‘ν° wμ κ°μ λ°©ν₯μ 벑ν°μ΄λ©°, ν¬κΈ°λ v⋅w / |w|²μ λλ€.
- μμ μλ λ°©μμ λ€μκ³Ό κ°μ΅λλ€:
- vμ wμ λ΄μ μ κ³μ°νμ¬ λ λ²‘ν° μ¬μ΄μ κ΄κ³λ₯Ό μΈ‘μ ν©λλ€. μ΄λ λ²‘ν° vκ° λ²‘ν° wμ μ΄λ μ λ λ°©ν₯μ΄ κ°μμ§λ₯Ό λνλ λλ€.
- μ΄ κ°μ λ²‘ν° wμ ν¬κΈ°μ μ κ³±(μ¦, |w|²)μΌλ‘ λλμ΄ μ κ·νν©λλ€.
- μ΄ κ°μ λ²‘ν° wλ₯Ό κ³±νμ¬ λ²‘ν° v1λ₯Ό κ³μ°ν©λλ€.
def squared_distance(v, w):
"""λ λ²‘ν° vμ w μ¬μ΄μ μ κ³± 거리(squared distance)λ₯Ό κ³μ°ν©λλ€."""
return sum_of_squares(vector_subtract(v, w))
- vector_subtract(v, w)λ λ²‘ν° vμμ λ²‘ν° wλ₯Ό λΊ κ²°κ³Όλ₯Ό λ°ννλ ν¨μμ λλ€.
- sum_of_squares(vector_subtract(v, w))λ μμ κ²°κ³Ό 벑ν°μ κ° μμλ₯Ό μ κ³±νκ³ λͺ¨λ ν©ν κ°μ λ°νν©λλ€.
- μ΄λ₯Ό ν΅ν΄ λ λ²‘ν° μ¬μ΄μ μ κ³± 거리λ₯Ό κ³μ°ν©λλ€.
Euclidean Distance between two vectors
μ€λͺ → Euclidean Distance between two vectors: π©,πͺ
- λ²‘ν° pμ qκ° κ°κ° λ€μκ³Ό κ°μ μ’νλ₯Ό κ°μ§λ€κ³ κ°μ ν©λλ€.
- p = [p1,p2,...,pn]
- [π1,π2,...,ππ]
- q = [q1,q2,...,qn]
- [π1,π2,...,ππ]
- μ΄ λ, pμ q μ¬μ΄μ μ ν΄λ¦¬λ 거리λ λ€μκ³Ό κ°μ΄ κ³μ°ν μ μμ΅λλ€:
- μ΄λ λ λ²‘ν° μ¬μ΄μ κ° μ’ν μ°¨μ΄μ μ κ³±μ λͺ¨λ λν ν, κ·Έ κ°μ μ κ³±κ·Όμ μ·¨ν κ²μ λλ€.
- λ€λ₯Έ ννμΌλ‘, λ λ²‘ν° μ¬μ΄μ μ ν΄λ¦¬λ 거리λ λ λ²‘ν° pμ qμ μ°¨μ΄ λ²‘ν°λ₯Ό ꡬν ν, κ·Έ μ°¨μ΄ λ²‘ν°μ ν¬κΈ°λ₯Ό κ³μ°ν κ°μ΄λΌκ³ λ λ³Ό μ μμ΅λλ€.
- distance = β₯π−πβ₯
def distance(v, w):
"""λ λ²‘ν° vμ w μ¬μ΄μ μ ν΄λ¦¬λ 거리λ₯Ό κ³μ°ν©λλ€."""
return math.sqrt(squared_distance(v, w))
- squared_distance(v, w) ν¨μλ vμ w μ¬μ΄μ μ κ³± 거리λ₯Ό κ³μ°ν©λλ€.
- math.sqrtλ μμμ κ³μ°λ μ κ³± 거리λ₯Ό μ κ³±κ·Όμ ꡬνμ¬ μ ν΄λ¦¬λ 거리λ₯Ό λ°νν©λλ€.
- μ΄ ν¨μλ₯Ό μ¬μ©νμ¬ λ λ²‘ν° μ¬μ΄μ 거리λ₯Ό μΈ‘μ ν μ μμ΅λλ€.
Manhattan distance
맨ν΄νΌ 거리(Manhattan distance)λ λ λ²‘ν° λλ λ μ μ¬μ΄μ 거리λ₯Ό κ³μ°νλ λ°©λ² μ€ νλμ λλ€.
- 거리λ κ° μ’ν μ°¨μ΄μ μ λκ°μ ν©νμ¬ κ³μ°ν©λλ€. 맨ν΄νΌ 거리λ μ§μ μΌλ‘λ§ μ΄λν μ μλ λμ¬(Manhattan) 거리μμ λΉλ‘―λ μ΄λ¦μΌλ‘, μΆλ°©ν₯ 거리(axis-aligned distance)λΌκ³ λ ν©λλ€.
- λ λ²‘ν° pμ qκ° λ€μκ³Ό κ°μ μ’νλ₯Ό κ°μ§λ€κ³ κ°μ ν©λλ€:
- p = [p1,p2,...,pn]
- [π1,π2,...,ππ]
- q = [q1,q2,...,qn]
- [π1,π2,...,ππ]
- μ΄ λ, pμ q μ¬μ΄μ 맨ν΄νΌ 거리λ λ€μκ³Ό κ°μ΄ κ³μ°ν μ μμ΅λλ€:
- μ΄λ λ λ²‘ν° μ¬μ΄μ κ° μ’ν μ°¨μ΄μ μ λκ°μ λͺ¨λ ν©ν κ²μ λλ€.
def manhattan_distance(v, w):
"""λ λ²‘ν° vμ w μ¬μ΄μ 맨ν΄νΌ 거리λ₯Ό κ³μ°ν©λλ€."""
return sum(math.fabs(v_i - w_i) for v_i, w_i in zip(v, w))
- zip(v, w)λ₯Ό μ¬μ©νμ¬ λ λ²‘ν° vμ wμ μμλ₯Ό μμΌλ‘ μ§μ§μ΄ μνν©λλ€.
- v_iμ w_iμ μ λκ° μ°¨μ΄λ₯Ό κ³μ°νκ³ , μ΄λ¬ν μ°¨μ΄λ€μ ν©μ λ°νν©λλ€.
- 맨ν΄νΌ 거리λ κ° μ°¨μμμ λ λ²‘ν° μ¬μ΄μ μ λ μ°¨μ΄μ ν©μ μλ―Έν©λλ€.
- μ΄ ν¨μλ₯Ό μ¬μ©νμ¬ λ λ²‘ν° μ¬μ΄μ 맨ν΄νΌ 거리λ₯Ό μΈ‘μ ν μ μμ΅λλ€.
Cosine similarity
μ½μ¬μΈ μ μ¬λ(Cosine similarity)λ λ λ²‘ν° μ¬μ΄μ λ°©ν₯μ±μ λΉκ΅νλ μ²λμ λλ€.
- μ΄ μ²λλ λ λ²‘ν° μ¬μ΄μ μ½μ¬μΈ κ°λ(cosine of the angle)λ₯Ό μ¬μ©νμ¬ λ 벑ν°μ μ μ¬λλ₯Ό μΈ‘μ ν©λλ€.
- μ μ¬λλ λ 벑ν°κ° μλ‘ μΌλ§λ λΉμ·ν λ°©ν₯μ κ°μ§κ³ μλμ§ λνλ΄λ©°, -1μμ 1 μ¬μ΄μ κ°μ κ°μ§λλ€.
- μ½μ¬μΈ μ μ¬λλ λ€μκ³Ό κ°μ΄ κ³μ°ν μ μμ΅λλ€.
- v⋅w: λ²‘ν° vμ wμ λ΄μ (dot product)μ λλ€. μ΄λ λ 벑ν°μ κ° μ’νλ₯Ό κ³±ν ν λͺ¨λ λν κ°μ λλ€.
- β₯π£β₯β₯vβ₯μ β₯π€β₯: κ°κ° λ²‘ν° vμ wμ ν¬κΈ°(μ λκ°)μ λλ€. 벑ν°μ ν¬κΈ°λ κ° μ’νμ μ κ³±ν©μ μ κ³±κ·ΌμΌλ‘ κ³μ°ν©λλ€.
- λΆλͺ¨λ λ 벑ν°μ ν¬κΈ°λ₯Ό κ³±ν κ°μ΄λ©°, λΆμλ λ 벑ν°μ λ΄μ μ λλ€.
μ½μ¬μΈ μ μ¬λλ -1μμ 1 μ¬μ΄μ κ°μ κ°μ§λλ€.
1: λ 벑ν°κ° μμ ν κ°μ λ°©ν₯μ κ°μ§κ³ μμ΅λλ€.
0: λ 벑ν°κ° μμ§(μ§κ°) λ°©ν₯μ λλ€.
-1: λ 벑ν°κ° μμ ν λ°λ λ°©ν₯μ λλ€.
def cosine_similarity(v, w):
"""λ λ²‘ν° vμ w μ¬μ΄μ μ½μ¬μΈ μ μ¬λλ₯Ό κ³μ°ν©λλ€."""
return dot(v, w) / (magnitude(v) * magnitude(w))
v = [0,1,1,0]
w = [0,100,100,0]
u = [1,0,0,1]
y = [-1,0,0,-1]
print(cosine_similarity(v, w))
print(cosine_similarity(u, v))
print(cosine_similarity(u,y)
0.9999999999999999
0.0
-0.9999999999999998
- dot(v, w)λ vμ wμ λ΄μ μ κ³μ°ν©λλ€.
- magnitude(v)μ magnitude(w)λ κ°κ° vμ wμ ν¬κΈ°λ₯Ό κ³μ°ν©λλ€.
- μ½μ¬μΈ μ μ¬λλ λ 벑ν°μ λ΄μ μ κ° λ²‘ν°μ ν¬κΈ°λ₯Ό κ³±ν κ°μΌλ‘ λλ κ°μ λλ€.
- μ΄ κ°μ λ 벑ν°μ λ°©ν₯μ΄ μΌλ§λ μ μ¬νμ§(κ°λκ° μΌλ§λ μμμ§)λ₯Ό λνλ λλ€.
- μ½μ¬μΈ μ μ¬λμ κ°μ -1μμ 1κΉμ§μ λ²μλ₯Ό κ°μ§λ©°, 1μ κ°κΉμΈμλ‘ λ 벑ν°μ λ°©ν₯μ΄ μ μ¬ν¨μ μλ―Έν©λλ€.
Numpy Version
import numpy as np
v = np.array([1,1])
w = np.array([10,10])
print(np.dot(v - w, v - w)) # μ κ³± 거리
print(np.sqrt(np.dot(v - w, v - w))) # μ ν΄λ¦¬λ 거리
print(np.sum(np.fabs(v - w))) # 맨ν΄νΌ 거리
print(np.dot(v, w) / (np.sqrt(np.dot(v, v)) * np.sqrt(np.dot(w, w)))) # μ½μ¬μΈ μ μ¬λ
162
12.727922061357855
18.0
0.9999999999999998
- λ¬Έμ 벑ν°μμ λͺ¨λ κ΅¬μ± μμκ° μμκ° μλλ―λ‘ μ½μ¬μΈ μ μ¬λλ 0κ³Ό 1 μ¬μ΄μ΄λ©° μ½μ¬μΈκ±°λ¦¬λ μλμ μ½λμ²λΌ ννλ©λλ€.
cosine_distance(v, w) = 1 - cosine_similarity(v, w)
def cosine_distance(v, w):
"""λ²‘ν° vμ w μ¬μ΄μ μ½μ¬μΈ 거리λ₯Ό κ³μ°ν©λλ€."""
return 1 - cosine_similarity(v, w)
Matrics (νλ ¬)
νλ ¬(Matrix)μ μν λ° κ³΅νμμ μ€μν λꡬλ‘, μ«μλ λ³μμ μ§μ¬κ°ν λ°°μ΄μ μλ―Έν©λλ€.
- νλ ¬μ λ€μν μ°μ°κ³Ό λ³νμ νννλ λ° μ¬μ©λλ©°, μ ν λμνμ ν΅μ¬ κ°λ μ€ νλμ λλ€.
- νλ ¬μ λͺ©λ‘μΌλ‘ νμν©λλ€
- Aκ° νλ ¬μ΄λ©΄ A[i][j]λ iλ²μ§Έ νκ³Ό jλ²μ§Έ μ΄μ μλ μμμ λλ€.
A = [[1, 2, 3],
[4, 5, 6]] # A has 2 rows and 3 columns
B = [[1, 2],
[3, 4],
[5, 6]] # B has 3 rows and 2 columns
- λ§μ½μ 1,000λͺ μ ν€, λͺΈλ¬΄κ², κ·Έλ¦¬κ³ λμ΄μ λ°μ΄ν°λ₯Ό κ°μ§κ³ μλ€λ©΄, κ·Έκ²μ νλ ¬μ λ£μ μ μμ΅λλ€:
data = [[70, 170, 40],
[65, 120, 26],
[77, 250, 19],
# ....
]
def shape(A):
# νλ ¬ Aμ νκ³Ό μ΄ μλ₯Ό λ°ν
num_rows = len(A)
num_cols = len(A[0]) if A else 0
return num_rows, num_cols
def get_row(A, i):
# νλ ¬ Aμ iλ²μ§Έ νμ λ°ν
return A[i]
def get_column(A, j):
# νλ ¬ Aμ jλ²μ§Έ μ΄μ λ°ν
return [A_i[j] for A_i in A]
def make_matrix(num_rows, num_cols, entry_fn):
# μ£Όμ΄μ§ ν¬κΈ°μ νλ ¬μ μμ±νκ³ entry_fnμ λ°λΌ μ±μ
return [[entry_fn(i, j) for j in range(num_cols)]
for i in range(num_rows)]
def is_diagonal(i, j):
# λκ°μ μ ν΄λΉνλ κ²½μ° 1, κ·Έ μΈμλ 0μ λ°ν
return 1 if i == j else 0
identity_matrix = make_matrix(5, 5, is_diagonal) # 5x5 νλ± νλ ¬ μμ±
import random
random_matrix = make_matrix(5, 5, lambda i, j: random.choice([0, 1])) # 5x5 λλ€ νλ ¬ μμ±
random_matrix
[[0, 1, 1, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 0, 0, 0, 1]]
- shape(A):
- μν : νλ ¬ Aμ νκ³Ό μ΄μ μλ₯Ό λ°νν©λλ€.
- μ¬μ©: νλ ¬μ ν¬κΈ°λ₯Ό μκ³ μΆμ λ μ¬μ©ν©λλ€.
- get_row(A, i):
- μν : νλ ¬ Aμ iλ²μ§Έ νμ λ°νν©λλ€.
- μ¬μ©: νλ ¬μ νΉμ νμ μΆμΆνκ³ μ ν λ μ¬μ©ν©λλ€.
- get_column(A, j):
- μν : νλ ¬ Aμ jλ²μ§Έ μ΄μ λ°νν©λλ€.
- μ¬μ©: νλ ¬μ νΉμ μ΄μ μΆμΆνκ³ μ ν λ μ¬μ©ν©λλ€.
- make_matrix(num_rows, num_cols, entry_fn):
- μν : num_rows x num_cols ν¬κΈ°μ νλ ¬μ μμ±ν©λλ€. νλ ¬μ κ° μμλ entry_fn ν¨μμ μν΄ μ±μμ§λλ€.
- μ¬μ©: μ£Όμ΄μ§ ν¬κΈ°μ νλ ¬μ νΉμ ν κ·μΉμ λ°λΌ μμ±νκ³ μ ν λ μ¬μ©ν©λλ€.
- is_diagonal(i, j):
- μν : μΈλ±μ€ iμ jκ° κ°μ κ²½μ° 1μ λ°ννκ³ , λ€λ₯΄λ©΄ 0μ λ°νν©λλ€. λκ°μ μ μλμ§λ₯Ό νμΈν©λλ€.
- μ¬μ©: νλ ¬μ λκ°μ λΆλΆμ μ±μ°λ λ° μ¬μ©λ©λλ€.
- identity_matrix:
- μν : make_matrix ν¨μλ₯Ό μ΄μ©νμ¬ 5x5 ν¬κΈ°μ νλ± νλ ¬μ μμ±ν©λλ€.
- μ¬μ©: νλ± νλ ¬μ μμ±νκ³ μ ν λ μ¬μ©λ©λλ€.
- random_matrix:
- μν : make_matrix ν¨μλ₯Ό μ΄μ©νμ¬ 5x5 ν¬κΈ°μ λλ€ νλ ¬μ μμ±ν©λλ€. κ° μμλ 0 λλ 1λ‘ λ¬΄μμλ‘ μ±μμ§λλ€.
- μ¬μ©: λλ€ νλ ¬μ μμ±νκ³ μ ν λ μ¬μ©λ©λλ€.
Numpy Version
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[1, 2],
[3, 4],
[5, 6]])
A.shape # νκ³Ό μ΄μ κ°μλ₯Ό λνλ
λλ€.
A[1, :] # ν 1μ λͺ¨λ μ΄ μμλ₯Ό κ°μ Έμ΅λλ€.
A[:, 1] # μ΄ 1μ λͺ¨λ ν μμλ₯Ό κ°μ Έμ΅λλ€.
np.eye(5, 5) # 5x5 λ¨μνλ ¬μ μμ±ν©λλ€.
# 5x5 ν¬κΈ°μ νλ ¬μ [0,1] μ€μμ 무μμλ‘ μ ννμ¬ μμ±ν©λλ€.
np.array([np.random.choice([0, 1]) for _ in np.arange(25)]).reshape(5, 5)
# 5x5 ν¬κΈ°μ νλ ¬μ 무μμλ‘ μμ±νκ³ , κ° μμλ₯Ό 0.5 μ΄μμΈμ§λ₯Ό νλ¨νμ¬ 0 λλ 1λ‘ λ³νν©λλ€.
np.vectorize(np.int)(np.random.rand(25) >= 0.5).reshape(5, 5)
array([[1, 1, 0, 0, 0],
[0, 0, 1, 0, 1],
[1, 1, 0, 0, 0],
[0, 0, 1, 1, 0],
[1, 0, 0, 1, 1]])
- dot(v, w)λ vμ wμ λ΄μ μ κ³μ°ν©λλ€.
- magnitude(v)μ magnitude(w)λ κ°κ° vμ wμ ν¬κΈ°λ₯Ό κ³μ°ν©λλ€.
- μ½μ¬μΈ μ μ¬λλ λ 벑ν°μ λ΄μ μ κ° λ²‘ν°μ ν¬κΈ°λ₯Ό κ³±ν κ°μΌλ‘ λλ κ°μ λλ€.
- μ΄ κ°μ λ 벑ν°μ λ°©ν₯μ΄ μΌλ§λ μ μ¬νμ§(κ°λκ° μΌλ§λ μμμ§)λ₯Ό λνλ λλ€.
- μ½μ¬μΈ μ μ¬λμ κ°μ -1μμ 1κΉμ§μ λ²μλ₯Ό κ°μ§λ©°, 1μ κ°κΉμΈμλ‘ λ 벑ν°μ λ°©ν₯μ΄ μ μ¬ν¨μ μλ―Έν©λλ€.
Two representations for friendships
- representation in Chapter 1
friendships = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4),
(4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)]
- Alternative notation
# user 0 1 2 3 4 5 6 7 8 9
#
friendships = [[0, 1, 1, 0, 0, 0, 0, 0, 0, 0], # user 0
[1, 0, 1, 1, 0, 0, 0, 0, 0, 0], # user 1
[1, 1, 0, 1, 0, 0, 0, 0, 0, 0], # user 2
[0, 1, 1, 0, 1, 0, 0, 0, 0, 0], # user 3
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0], # user 4
[0, 0, 0, 0, 1, 0, 1, 1, 0, 0], # user 5
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 6
[0, 0, 0, 0, 0, 1, 0, 0, 1, 0], # user 7
[0, 0, 0, 0, 0, 0, 1, 1, 0, 1], # user 8
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]] # user 9
friendships[0][2] == 1 # True, 0κ³Ό 2λ μΉκ΅¬μ
λλ€
friendships[0][8] == 1 # False, 0, 8μ μΉκ΅¬κ° μλλλ€
False
friends_of_five = [i # only need
for i, is_friend in enumerate(friendships[5]) # to look at
if is_friend] # one row
print(friends_of_five)
[4, 6, 7]
Numpy Version
friendships = np.array(friendships) # μΉκ΅¬ κ΄κ³λ₯Ό λνλ΄λ 2D λ°°μ΄μ λ§λλλ€.
# 0κ³Ό 2κ° μΉκ΅¬μΈμ§ νμΈν©λλ€. (0ν, 2μ΄ κ°μ΄ 1μ΄λ©΄ True)
print(friendships[0, 2] == 1)
# 0κ³Ό 8μ΄ μΉκ΅¬μΈμ§ νμΈν©λλ€. (0ν, 8μ΄ κ°μ΄ 1μ΄λ©΄ True)
print(friendships[0, 8] == 1)
# 5μ μΉκ΅¬ λͺ©λ‘μ κ°μ Έμ΅λλ€. (5νμ κ° μ€ 1μΈ μμλ€μ μΈλ±μ€λ₯Ό λ°νν©λλ€.)
print(np.argwhere(friendships[5] == 1))
array([[4],
[6],
[7]], dtype=int64)
Matrix Addition
def matrix_add(A, B):
# λ νλ ¬μ ν¬κΈ°κ° λ€λ₯Έ κ²½μ° μμΈλ₯Ό λ°μμν΅λλ€.
if shape(A) != shape(B):
raise ArithmeticError("cannot add matrices with different shapes")
# νλ ¬ Aμ Bμ ν¬κΈ°λ₯Ό κ°μ Έμ΅λλ€.
num_rows, num_cols = shape(A)
# κ° μμΉμ μμλ€μ λνμ¬ μλ‘μ΄ νλ ¬μ μμ±ν©λλ€.
def entry_fn(i, j): return A[i][j] + B[i][j]
# `make_matrix` ν¨μλ₯Ό μ¬μ©νμ¬ κ²°κ³Ό νλ ¬μ μμ±ν©λλ€.
return make_matrix(num_rows, num_cols, entry_fn)
- shape(A) != shape(B): νλ ¬ Aμ Bμ ν¬κΈ°λ₯Ό λΉκ΅ν©λλ€. ν¬κΈ°κ° λ€λ₯΄λ©΄ μμΈλ₯Ό λ°μμν΅λλ€.
- num_rows, num_cols = shape(A): νλ ¬ Aμ νκ³Ό μ΄μ μλ₯Ό κ°μ Έμ΅λλ€.
- def entry_fn(i, j): return A[i][j] + B[i][j]: κ° μμΉ (i, j)μμ Aμ Bμ μμλ₯Ό λνλ ν¨μμ λλ€.
- return make_matrix(num_rows, num_cols, entry_fn): make_matrix ν¨μλ₯Ό μ¬μ©νμ¬ κ²°κ³Ό νλ ¬μ μμ±ν©λλ€.
Numpy Version
A = np.array([[1,1],[2,2]])
B = np.array([[3,3],[4,4]])
print(A + B) # νλ ¬ Aμ Bμ μμλ³ λ§μ
(μμλ³ λ§μ
)
print(A * B) # νλ ¬ Aμ Bμ μμλ³ κ³±μ
(μμλ³ κ³±μ
)
print(np.transpose(A)) # νλ ¬ Aμ μ μΉ (νκ³Ό μ΄μ λ€μ§μ νν)
print(A.T) # νλ ¬ Aμ μ μΉ (np.transpose(A)μ λμΌ)
print(A.dot(B)) # νλ ¬ Aμ Bμ νλ ¬ κ³±μ
print(np.matmul(A, B)) # νλ ¬ Aμ Bμ νλ ¬ κ³±μ
(A.dot(B)μ λμΌ)
C = np.array([[1., 2.], [3., 4.]])
print(np.linalg.det(C)) # νλ ¬ Cμ νλ ¬μ (determinant)
print(np.linalg.inv(C)) # νλ ¬ Cμ μνλ ¬ (inverse)
print(C.dot(np.linalg.inv(C))) # νλ ¬ Cμ Cμ μνλ ¬μ κ³±μ
(κ²°κ³Όλ λ¨μ νλ ¬)
print(np.linalg.eig(C)) # νλ ¬ Cμ κ³ μ κ°κ³Ό κ³ μ λ²‘ν° (eigenvalues and eigenvectors)
[[4 4]
[6 6]]
[[3 3]
[8 8]]
[[1 2]
[1 2]]
[[1 2]
[1 2]]
[[ 7 7]
[14 14]]
[[ 7 7]
[14 14]]
-2.0000000000000004
[[-2. 1. ]
[ 1.5 -0.5]]
[[1.00000000e+00 1.11022302e-16]
[0.00000000e+00 1.00000000e+00]]
(array([-0.37228132, 5.37228132]), array([[-0.82456484, -0.41597356],
[ 0.56576746, -0.90937671]]))
More on types of attributes
- λͺ
λͺ©(Nominal) μμ±:
- μμ± κ° κ°μ μ°μ μμλ μμκ° μμ΅λλ€. μ¦, λͺ¨λ κ°μ λλ±ν©λλ€.
- μ: ID λ²νΈ, λ μκΉ, μ°νΈλ²νΈ λ±. μ΄λ€μ μλ‘ κ΅¬λ³λμ§λ§ μμλ ν¬κΈ°κ° μμ΅λλ€.
- μμ΄(Ordinal) μμ±:
- μμ± κ° κ°μ μ°μ μμλ μμκ° μμ΅λλ€. κ·Έλ¬λ κ° μ¬μ΄μ μ°¨μ΄κ° μΌμ νμ§ μμ΅λλ€.
- μ: μμ (μ: κ°μ μΉ©μ λ§μ 1~10κΉμ§ νκ°), νλ , ν€ (μ: ν€κ° ν°, μ€κ°, μμ) λ±μ΄ μμ΅λλ€.
- ꡬκ°(Interval) μμ±:
- μμ± κ° κ°μ μ°¨μ΄λ₯Ό λΉκ΅ν μ μμ§λ§, μ λμ μΈ μμ (0)μ΄ μμ΅λλ€.
- μ: λ¬λ ₯ λ μ§, μμ¨λ νμ¨ μ¨λ λ±. μ¨λμ κ²½μ° μ°¨μ΄λ λΉκ΅ν μ μμ§λ§, μμ¨λ νμ¨λ μ λμ μΈ μμ μ΄ μμ΅λλ€.
- λΉμ¨(Ratio) μμ±:
- μ λμ μΈ μμ (0)μ΄ μμΌλ©° μμ± κ° κ°μ λΉμ¨μ λΉκ΅ν μ μμ΅λλ€.
- μ: μΌλΉ μ¨λ, κΈΈμ΄, μκ°, κ°μ λ±. μ΄λ¬ν μμ±μ 0μ΄ μλ―Έ μλ κ°μ κ°μ§λ―λ‘ κ° κ°μ λΉμ¨μ λΉκ΅ν μ μμ΅λλ€.
Properties of Attribute Values
- μμ±μ μ νμ λ€μ μμ±/μμ μ€ μ΄λ κ²μ μμ νλμ§μ λ°λΌ λ¬λΌμ§λλ€.
- ꡬλ³μ±(Distinctness): =
- μμ± κ°μ΄ μλ‘ λ€λ₯Έμ§ μ¬λΆλ₯Ό νμΈνλ μ°μ°μ λλ€. μμ± κ° μ¬μ΄μ ꡬλ³μ±μ΄ μλ€λ©΄ ν΄λΉ μμ±μ μλ‘ λ€λ₯Έ κ°μ κ°μ§ μ μμ΅λλ€. μ΄λ λͺ λͺ©(Nominal), μμ΄(Ordinal), ꡬκ°(Interval), λΉμ¨(Ratio) μμ± λͺ¨λμ ν΄λΉλ©λλ€.
- μμ(Order): < >
- μμ± κ° κ°μ μμλ₯Ό λΉκ΅νλ μ°μ°μ λλ€. μλ₯Ό λ€μ΄, μ΄λ κ°μ΄ λ€λ₯Έ κ°λ³΄λ€ μμμ§, ν°μ§ λ±μ λΉκ΅ν μ μμ΅λλ€. μ΄λ μμ΄(Ordinal), ꡬκ°(Interval), λΉμ¨(Ratio) μμ±μ ν΄λΉν©λλ€.
- μ°¨μ΄(Differences): + -
- μμ± κ° κ°μ μ°¨μ΄λ₯Ό κ³μ°ν μ μλ μ°μ°μ λλ€. μλ₯Ό λ€μ΄, μμ± κ° μ¬μ΄μ μ°¨μ΄λ₯Ό κ³μ°νμ¬ μλ―Έ μλ μ 보λ₯Ό μ»μ μ μμ΅λλ€. μ΄λ ꡬκ°(Interval), λΉμ¨(Ratio) μμ±μ ν΄λΉν©λλ€.
- λΉμ¨(Ratios): * /
- μμ± κ° κ°μ λΉμ¨μ κ³μ°ν μ μλ μ°μ°μ λλ€. μλ₯Ό λ€μ΄, ν μμ± κ°μ΄ λ€λ₯Έ μμ± κ°μ λͺ λ°°μΈμ§λ₯Ό κ³μ°ν μ μμ΅λλ€. μ΄λ λΉμ¨(Ratio) μμ±μ ν΄λΉν©λλ€.
κ° μμ± μ νμ μ΄λ¬ν μμ±/μ°μ° μ€ μΌλΆ λλ λͺ¨λ κ²μ κ°κ³ μμ΅λλ€.
- λͺ λͺ©(Nominal) μμ±: ꡬλ³μ±(Distinctness)
- μμ΄(Ordinal) μμ±: ꡬλ³μ±(Distinctness)κ³Ό μμ(Order)
- ꡬκ°(Interval) μμ±: ꡬλ³μ±(Distinctness), μμ(Order), μλ―Έ μλ μ°¨μ΄(Differences)
- λΉμ¨(Ratio) μμ±: ꡬλ³μ±(Distinctness), μμ(Order), μλ―Έ μλ μ°¨μ΄(Differences), λΉμ¨(Ratios)
λ°μν
'π Data Mining' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Data Mining] Gradient Descent (κ²½μ¬ νκ°λ²) (0) | 2024.07.23 |
---|---|
[Data Mining] Statistics (ν΅κ³ν) (0) | 2024.07.14 |
[Data Mining] Introduction to Numpy part.2 (0) | 2024.07.05 |
[Data Mining] Introduction to Numpy part.1 (0) | 2024.06.26 |
[Data Mining] Visualizing Data (0) | 2024.06.25 |