-
중간 과제2 : 코사인 유사도를 이용한 색상 추출의 타당성(개념)공부/likelion 2021. 10. 3. 19:01
Cosine Similarity를 이용한 Color Extraction의 타당성.
들어가기 전.
본인은 저런 식으로 영어 섞어서 말하는 거 굉장히 안좋아한다. 당신이 영어가 약해서 그런 거 아니냐라는 식의 인신공격의 오류를 범하는 사람은 제발 없길 빈다. 코사인, 벡터 같이 대체가 안되는 고유명사이거나 영한번역간 의미가 미세하게 변해 그 명칭을 써야지만 의미가 전달되는 경우에는 그럴 수 있다고 생각하는데, 그게 아니라 일부러 코사인 법칙도 '코사인 로우'라고 발음한다거나, 다른 단어들도 다 한국어로 완역이 가능한 경우인데도 불구하고 꼭 영어를 섞어쓰는 사람들이 있다.
그런 사람들에게 유시민씨의 저 말을 그대로 전해주고 싶다.
어렵게 쓰는 사람 = 사기치려는 사람 = 사회와 개인의 발전을 가로막는 사람
이 사람이 말한 건 글을 어렵게 쓰는 사람에 대한 것이지만, 말과 글이 다른 것인가?
저 문제는 말 뿐만 아니라 대화 간에도 분명히 발생하고 있는 문제라고 생각한다.
영어로 말한다고 청자에게 의미가 명확하게 전달되면 상관이 없겠지만,
그게 아니라면 화자가 청자의 언어 수준을 일일이 알 수 없을테니
모국어를 기준으로 전달하는 것이 좀 더 빠르고 정확하게 의미가 전달될 수 있을 것이다.영어에서 한국어로 번역하는 과정에서 그 의미가 퇴색된다면,
그러한 부분에 대해서 분명히 언급하고 넘어가면 충분할테지만,
그렇게 의미가 퇴색되지 않는다면 제발 영어로 씨부리지 좀 않았으면 좋겠다.
'나는 내가 알고 있는 이 영단어를 국어로 번역하지 못해요'라고 말하는 것이랑 똑같으니까.
때문에 이전 글들은 시간이 부족해서 적당히 영어를 섞어썼는데,
앞으로는 고등학생의 수준에서 한영 혼용 가능한 단어가 아닌 경우,
그리고 번역할 경우 의미가 퇴색되는 경우가 아닌 경우에 한해,
해당 단어에 대하여 가능한한 한글로 완역하여 쓸 것임을 미리 알려둔다.
목차)
1. 관련된 수학 내용 정리
- Dot product(스칼라곱)
- Vector Norm(벡터의 놈), Unit Vector(단위벡터), Vector Unitization(벡터의 단위화)
- Cosine Similarity(코사인 유사도)
2. 코드에 대한 설명
- 연산에 대한 구체적인 설명
- 중간단계의 시각화 및 시각화된 데이터 분석
3. 여러가지 상황에서의 테스트
4. 결과 분석
5. 추가 연구(Further Studies)
6. 부록
- 발생 문제에 대한 분석 및 해결
1. 관련된 수학 내용 정리
(1) Dot product(스칼라곱 또는 점곱)[1]이는 유클리드 공간의 두 벡터로부터 실수 스칼라를 얻는 연산이다.
또는 이 곱이 해당 공간의 내적을 이루므로, 이를 단순히 내적이라고 부르기도 한다.이러한 연산은 각 벡터끼리 같은 위치의 성분을 곱한 후 이를 전부 합하여 얻을 수 있는데,
예를 들어이 두 3차원 벡터의 스칼라곱은 다음과 같다.
두 벡터의 각각 1,2,3번째 요소끼리 곱하고 있다. 또는 유클리드 공간에서의 벡터는 행렬 벡터로 볼 수 있기 때문에 유클리드 공간에서의 스칼라곱은
라고 볼 수 있는 것이다.
해당 행렬 벡터의 스칼라곱이 이해하기 어렵다면
행렬의 곱셈이 어떤 식으로 진행되는지를 찾아보면 이해가 쉬울듯하다.#코드
#스칼라곱 sizes = 10 a = np.random.randint(0,2,(sizes,1)) b = np.random.randint(0,2,(sizes,1)).T print(a) print(b) print(np.dot(b,a))
a는 1 x sizes인 열백터, b는 sizes x 1인 행벡터이므로 두 벡터를 곱하면 스칼라가 된다.
실제 출력은 저것과 다르지만, 보기 쉽게 일부러 둘 다 열벡터로 출력하였다.
이러한 스칼라 곱의 기하학적 정의를 보자면, 길이와 각도를 통해 다음과 같이 정의할 수 있는데,
이를 변형하면 다음과 같은 a,b 벡터에 사이의 코사인 각도를 구하는 공식을 얻을 수 있다.
기하학적 정의와 관련된 사항은 [1]번을 참조하자.
(2) Vector Norm(벡터의 놈), Unit Vector(단위벡터), Vector Unitization(벡터의 단위화)
언급해야할 것이 많지만, 우선 벡터의 놈부터 언급해보자.
Vector Norm(벡터의 놈)
에서 Norm이란, 벡터의 크기 또는 길이를 측정하는 방법을 뜻한다.
때문에 방식이라고도 할 수 있겠지만, 언어의 사회성을 고려하여 norm 이라고 표기한다.그래서 이러한 벡터의 크기를 측정하기 위한 두가지 방법이 있는데, 그것을 각각 L1 norm, L2 norm이라고 칭한다.
이 두가지 방법의 다른 명칭은 다음과 같다.L1 norm : Manhattan Norm 또는 Taxicab norm (맨해튼 norm 또는 택시 norm)
L2 norm : Euclidean norm (유클리드 norm)간단하게 언급하자면, L1 norm 같은 경우에는 벡터의 모든 성분의 절대값을 더하는 방식이다.
원점에서 택시를 타고 갈 때 어떤 길로 가더라도, 가장 빠르게 갈 수 있는 길이는 5이다.
L1 norm은 이런식으로 길이를 측정하는 방식이다.
L2 norm은 출발점에서 도착점까지의 거리를 직선거리로 측정한다.
피타고라스 정의와 동일한 방식으로 측정한다고 생각하면 된다.
이 외에도 더 다양한 norm이 많지만, [3],[4]에서 참조하자.
#코드
#벡터의 norm #L1 a = np.arange(-2,3) L1_norm = np.sum(np.abs(a)) L1_norm_np = np.linalg.norm(a,1) print(a) print(L1_norm) print(L1_norm_np)
#L2 b = np.array([1,2,3,4,5]) L2_norm = np.sqrt(np.sum(b**2)) L2_norm_np = np.linalg.norm(b,2) print(b) print(L2_norm) print(L2_norm_np)
numpy의 함수와, 수식을 구현한 결과가 같은 걸 볼 수 있다.
Unit Vector(단위벡터)와 Vector Unitization(벡터의 단위화)
단위 벡터는, 길이가 1인 벡터다.
때문에 꽤 유용한 벡터인데, 여러 차원이 있고, 그 차원 안에서 벡터를 표현하고 싶다고 할 때,
해당 차원만큼의 단위 벡터를 사용하면 해당 차원에서 벡터의 표현이 가능하다.벡터 v의 단위 벡터는
이렇게 쓰고, '브이 헷'이라고 읽는다.
예를 들어 3차원일때 우리가 벡터 a를 표현하고 싶다고 할 때, 이렇게 표현할 수 있다.
m,n,o는 상수이다 그렇다면 이러한 단위 벡터는 어떻게 구할 수 있을까?
단위 벡터를 구하기 위한 방법, 이러한 방법을 벡터의 단위화라고 한다.
방법은 간단하다. 벡터를 자기 자신의 길이로, 즉 norm으로 나눠주면 된다.간단히 일반 상수로 표현해보자.
일반 상수를 자기 자신으로 나누면 1이 되는 것처럼 단위벡터도 이와 같다고 생각하면 된다.[6]
단위 벡터에 대한 추가적인 동영상은 칸 아카데미를 참조하자.[7]
#코드
#단위벡터 unit_a = a / L1_norm unit_b = b / L2_norm #어떤 벡터의 단위 벡터의 길이를 측정하기 위해서는 #사용한 norm과 동일한 방식으로 단위 벡터의 길이를 측정해야한다. print(np.sum(np.abs(unit_a))) print(np.sum(unit_b**2))
단위벡터를 코드로 구현해볼때 실수하기 쉬운 것이,
대부분의 인터넷의 정보가 L2 norm을 위주로 작성되어있기 때문에단위 벡터를 제곱해 그 원소의 값들을 더한 것이 1이 나온다고 착각하는 경우가 있다.
무조건 단위벡터를 제곱해서 원소의 값들을 구하는 것이 아니라,
해당 벡터의 단위를 측정하기 위해서는, 사용한 norm과 동일한 방식으로 측정해야 한다.좌표 평면 선상에서 어떤식으로 나타나는지 알아보자.
L1과 L2는 좌표평면 선상에서 다음과 같이 나타나지만,L1 norm L1의 경우 해당 그림에서 파란색 마름모 선 위에 벡터가 위치할 경우에만
해당 단위 벡터의 모든 원소(β_0, β_1)의 절대값의 합이 1이 되기 때문에 마름모로 나타나며
L2는 다음과 같이 원형으로 나타나는 것을 볼 수 있다.L2 norm
Cosine Similarity(코사인 유사도)
코사인 유사도란, 두 벡터 간 코사인 각도를 사용해서 구할 수 있는 두 벡터가 얼마나 유사한지를 가리킨다.
특성
- 값: 완전히 동일하면 1, 서로 직교, 수직일 경우 0, 반대의 방향이면 -1
- 값의 의미: 1은 완전히 동일한 벡터, 0이면 서로 독립적인 벡터, -1이면 완전히 반대인 벡터
- 범위: -1 ~ 1의 범위를 가진다고 볼 수 있다.
이러한 코사인 유사도는 위에서 언급했었던 스칼라곱(점곱)에서도 볼 수 있는데,
이를 조금 더 자세하게 풀어 써보면 다음과 같다.해당 유사도를 통해서
문장을 벡터화, 즉 단어를 수치화시키는 방법을 통해 문장을 벡터로 바꾼 뒤, 문서의 유사도를 구할 수도 있으며,
이미지에서 목표로 하는 색상을 추출해낼수도있다.#코드
doc1=np.array([1,0,1,0]) doc2=np.array([1,0,1,0]) cosine_similarity = np.dot(doc1, doc2)/(np.linalg.norm(doc1)*np.linalg.norm(doc2)) print(cosine_similarity) doc1=np.array([-1,0,-1,0]) doc2=np.array([1,0,1,0]) cosine_similarity = np.dot(doc1, doc2)/(np.linalg.norm(doc1)*np.linalg.norm(doc2)) print(cosine_similarity) doc1=np.array([0,1,0,1]) doc2=np.array([1,0,1,0]) cosine_similarity = np.dot(doc1, doc2)/(np.linalg.norm(doc1)*np.linalg.norm(doc2)) print(cosine_similarity)
각각 동일방향, 반대방향, 직교일때를 상정하고 만들어보았다.
직교일 경우 부호를 바꿔도 작동하는데, 직교는 여러 방향이 있다는 것을 생각하면 놀라운 일은 아니다.이제 필요한 개념에 대해서 알아보았으니, 다음은 실습을 해보자.
https://endure-life.tistory.com/28
참고 자료
[1]
스칼라곱 - 위키백과, 우리 모두의 백과사전
이 문서는 유클리드 공간 위의 내적에 관한 것입니다. 벡터 공간 위의 내적에 대해서는 내적 공간 문서를, 벡터와 스칼라의 곱셈에 대해서는 스칼라 곱셈 문서를 참고하십시오. 선형대수학에서,
ko.wikipedia.org
[2]
[선형대수학] 놈(norm)이란 무엇인가?
오늘은 놈(norm)에 대해 설명을 드리고자 합니다. 놈은 노름으로 발음하기도 하는데 둘다 어감이 좀 그렇죠? 선형대수학에서 놈은 벡터의 크기(magnitude) 또는 길이(length)를 측정하는 방법을 의미합
bskyvision.com
[3]
Norm (mathematics) - Wikipedia
Length in a vector space In mathematics, a norm is a function from a real or complex vector space to the nonnegative real numbers that behaves in certain ways like the distance from the origin: it commutes with scaling, obeys a form of the triangle inequal
en.wikipedia.org
[4]
l0-Norm, l1-Norm, l2-Norm, … , l-infinity Norm
I’m working on things related to norm a lot lately and it is time to talk about it. In this post we are going to discuss about a whole family of norm. What is a norm? Mathematically a norm is…
rorasa.wordpress.com
[5]
단위벡터 - 위키백과, 우리 모두의 백과사전
선형대수학에서, 단위 벡터 (單位 vector, 영어: unit vector)는 길이가 '1'인 벡터를 뜻한다. 벡터 v {\displaystyle v} 와 방향이 같은 단위 벡터는 종종 알파벳 위에 곡절 부호 (circumflex) 를 쓰고, '햇'이라
ko.wikipedia.org
[6]
Unit vector - Wikipedia
Vector of length one In mathematics, a unit vector in a normed vector space is a vector (often a spatial vector) of length 1. A unit vector is often denoted by a lowercase letter with a circumflex, or "hat", as in v ^ {\displaystyle {\hat {\mathbf {v} }}}
en.wikipedia.org
[7]
단위벡터란? (동영상) | 벡터 | Khan Academy
단위벡터는 그 크기가 정확히 1인 벡터입니다. 이는 다른 이유로 매우 유용합니다. 특히, 단위벡터 [0,1] 와 [1,0] 은 함께 다른 어떤 벡터든 만들 수 있습니다.
ko.khanacademy.org
추가 참고
https://www.journaldev.com/45324/norm-of-vector-python
Norm of a Vector in Python - Steps for Calculation - JournalDev
The norm of a vector refers to the length or the magnitude of a vector. There are different ways to calculate the length. The norm of a vector is a
www.journaldev.com
'공부 > likelion' 카테고리의 다른 글
7. Indexing and Slicing ndarrays (0) 2021.10.06 중간과제2. 코사인 유사도를 이용한 색상 추출의 타당성(실습) (0) 2021.10.03 6. Element-wise Operations and Broadcasting (0) 2021.10.01 5. Changing ndarrays (0) 2021.09.30 4. Meta-data of ndarrays (0) 2021.09.29