스칼라(scalar): 길이, 넓이, 질량, 온도 - 크기가만 주어지지만 완전히 표시되는 양
벡터(vector): 속도, 위치이동, 힘 - 크기뿐만 아니라 방향까지 지정하지 않으면 완전히 표현할 수 없는 양
벡터는 크기와 방향을 갖는 유향선분 - 2차원, 3차원 공간의 벡터는 화살표로 표현 가능

n개의 실수의 순서조를 n차원 벡터(n-dimensional vector)라 하고

로 나타낸다. 이 때 실수 () 괄호안의 x들을 x의 성분이라 한다.
1차원 벡터 -> (한 개의 숫자, 한 방향), v=(x)
2차원 벡터 (평면) -> 예) 서로 수직인 독립 방향이 2개, (두 개의 숫자, 두 개의 독립 방향), v=(x,y)
3차원 벡터 (공간) -> 세 개의 숫자, 세 개의 독립 방향, v=(x,y,z)
n차원 벡터 - 기저가 n개인 공간의 벡터
벡터의 성분이 모두 같으면 두 벡터는 같다.

Rn의 벡터 x, y, z 와 스칼라 h, k에 대하여 다음이 성립한다.

a = vector([1, 2, -3, 4])
b = vector([-2, 4, 1, 0])
print("a = ",a)
print("b = ",b)
print()
print( "a+b=", a+b)
print( "a-b=", a-b)
print( "-2*a=", -2*a)
a = (1, 2, -3, 4)
b = (-2, 4, 1, 0)
a+b= (-1, 6, -2, 4)
a-b= (3, -2, -4, 4)
-2*a= (-2, -4, 6, -8)


차례대로 x의 노름 (0에서부터의 거리), y의 노름, x에서 y를 뺀 것의 길이 (둘 사이의 거리)

1차원 → 선
2차원 → 평면
3차원 → 공간
4차원 → ? (직접 볼 수 없음)
기하학적으로는 4차원 벡터는 서로 직교하는 4개의 방향 성분을 가진 이동
서로 직교한다고 하는 이유는 그렇지 않으면
때문에 서로 직교하는 벡터로 정의한다.
(하지만 꼭 직교할 필요는 없다, 그저 계산하기 쉽도록 직교로 가정하는 것일 뿐)
a = vector([2, -1, 3, 2])
b = vector([3, 2, 1, -4])
print(a.norm())
print(b.norm())
print( (a-b).norm() )
3*sqrt(2)
sqrt(30)
5*sqrt(2)
주어진 데이터가 각 범주와 얼마나 가까운지 (혹은 유사한지) 판단하는 척도로 벡터의 노름은 데이터의 유사도를 판단하는 하나의 기준이 됨.

세 개의 데이터 A, B, C에 대하여 B는 A와 C 중 어느 데이터에 더 가까운지 판단하시오.
a = vector([0, 1, -7, 1])
b = vector([5, 2, -1, 3])
c = vector([-2, 0, -4, 6])
distAB = (a-b).norm()
distBC = (b-c).norm()
print("distAB: ", distAB)
print("distBC: ", distBC)
bool(distAB < distBC)
Share
distAB: sqrt(66)
distBC: sqrt(71)
True
B는 A와 더 가깝다

내적의 성질


내적은 "방향 + 벡터 길이"가 함께 들어간 값이기 때문에 그렇다고 할 수 없다.

각도(세타)를 보면 14인 벡터가 30도로 더 방향이 비슷하다고 할 수 있다.
그렇기 때문에 데이터 분석에서는 코사인 유사도를 이용한다.
데이터를 분석하는 사람이 단지 데이터의 패턴(방향)에만 관심이 있는 경우에는 앞서 학습한 (거리) 척도는 데이터의 유사도 분석에 적합하지 않다. 예를 들어, 아래 그림과 같이 주어진 두 데이터 a = (a1, a2)와 b=(b1, b2)의 경우에는 패턴(방향)은 유사하지만 거리는 매우 큰 값을 갖게 되어 거리 척도로는 두 데이터가 유사하지 않은 것으로 판단할 수 있다.


코사인 세타는 얼마나 큰가를 제거(normalization)하고 "얼마나 같은 방향인가"만 측정하기 위해 사용된다.

a=vector([0, 1, -7, 1])
b=vector([5,2,1,3])
c=vector([-2,0,-4,6])
cos_simAB = a.inner_product(b)/(a.norm()*b.norm()) # 코사인 유사도
cos_simBC = b.inner_product(c)/(b.norm()*c.norm())
print("cos_sim(A,B) = ", cos_simAB.n(digits = 3))
print("cos_sim(B,C) = ", cos_simBC.n(digits = 3))
bool(cos_simAB < cos_simBC)
cos_sim(A,B) = -0.0448
cos_sim(B,C) = 0.0856
True

w는 y에서 x 부분을 없앤 것이기 때문에 w=y-p 그러므로 y=p+w, w는 y의 벡터성분


x = vector([2, -1, 3])
y = vector([4, -1, 2])
yx = y.inner_product(x) # 벡터 x와 y의 내적 구하기
xx = x.inner_product(x) # 벡터 x와 x의 내적 구하기
p = yx/xx*x # 벡터의 정사영 구하기
w = y-p
print("x=", x)
print("y=", y)
print("yx=", yx)
print("xx=", xx)
print("p=", p)
print("w=", w)
x= (2, -1, 3)
y= (4, -1, 2)
yx= 15
xx= 14
p= (15/7, -15/14, 45/14)
w= (13/7, 1/14, -17/14)


평면과 (그 평면에 없는) 한 점 사이의 거리 D를 구할 대는 평면의 방정식을 ax+by+cz+d=의 형태로 바꾸어 놓고 사용해야 한다.

v=vector([3, -1, 2])
n=vector([1, 3, -2])
d=-6
vn=v.inner_product(n) # 벡터 v와 n의 내적 구하기
nn=n.norm() # 벡터 n의 노름 구하기
Dist = abs(vn + d)/nn # abs() 입력된 숫자나 수식의 결과값에서 부호를 제거하고 절대값(0으로부터의 거리)만을 반환하는 수학 및 프로그래밍 함수
print("P=", v)
print("n=", n)
print(Dist)
P= (3, -1, 2)
n= (1, 3, -2)
5/7*sqrt(14)
거리나 코사인 유사도를 사용하여 유사도를 볼 수 있으나:
사용 예
측정
∣∣x−y∣∣
의미
실제 위치가 가까운가
사용 예
측정
cosθ
의미
방향(패턴)이 비슷한가