다운로드
작성자: admin 작성일시: 2016-05-12 22:18:38 조회수: 10709 다운로드: 491
카테고리: 기초 수학 태그목록: NumPy 선형대수

NumPy를 활용한 선형대수 입문

선형대수(linear algebra)는 데이터 분석에 필요한 각종 계산을 돕기 위한 학문이다. 데이터 분석을 하려면 수많은 숫자로 이루어진 데이터를 다루어야 한다. 하나의 데이터가 수십 개에서 수만 개의 숫자로 이루어져 있을 수도 있고, 또 이러한 데이터 수만 개가 하나의 집합을 이루고 있을 수도 있다.

선형대수를 사용하면 대량의 데이터를 포함하는 복잡한 계산 과정을 몇 글자 되지 않는 간단한 수식으로 서술할 수 있다. 따라서 데이터를 다루는 과정을 정확하고 간단하게 서술할 수 있다. 이를 위해 우선 선형대수에서 사용되는 여러 가지 기호와 개념을 익혀보자.

데이터의 유형

선형대수에서 다루는 데이터는 개수나 형태에 따라 크게 스칼라(scalar), 벡터(vector), 행렬(matrix)의 세 가지 유형으로 나누어진다. 간단하게 말하자면 스칼라는 숫자 하나로 이루어진 데이터이고, 벡터는 여러 개의 숫자로 이루어진 데이터 레코드(data record)이며, 행렬은 이러한 벡터, 즉 데이터 레코드가 여러 개 있는 데이터 집합이라고 볼 수 있다.

스칼라

스칼라는 하나의 숫자만으로 이루어진 데이터를 말한다. 예를 들어 어떤 붓꽃 한 송이의 꽃잎 길이를 측정하면 숫자가 하나 나올 것이다. 이 데이터는 스칼라이다. 스칼라는 보통 $x$와 같이 알파벳 소문자로 표기하며 실수(real number)인 숫자 중의 하나이므로 실수 집합 $\mathbf{R}$의 원소라는 의미에서 다음처럼 표기한다.

$$ x \in \mathbf{R} $$

벡터

벡터는 여러 개의 숫자가 특정한 순서대로 모여 있는 것을 말한다. 사실 대부분의 데이터 레코드는 여러 개의 숫자로 이루어진 경우가 많다. 예를 들어 붓꽃의 종을 알아내기 위해 크기를 측정할 때, 꽃잎의 길이 $x_1$뿐 아니라 꽃잎의 폭 $x_2$, 꽃받침의 길이 $x_3$, 꽃받침의 폭 $x_4$라는 4개의 숫자를 측정할 수도 있다. 이렇게 측정된 4개의 숫자는 한 송이의 붓꽃에서 나온 데이터이므로 따로따로 다루기보다는 하나의 쌍(tuple)으로 묶어놓는 것이 좋다. 이때 숫자의 순서가 바뀌면 어떤 숫자가 꽃잎의 길이이고 어떤 숫자가 꽃받침의 폭인지 알 수 없으므로 숫자의 순서를 유지하는 것이 중요하다. 이런 데이터 묶음을 선형대수에서는 벡터라고 부른다.

붓꽃의 예에서는 4개의 데이터 $(x_1, x_2, x_3, x_4)$가 하나로 묶여 있는데 이를 선형 대수 기호로는 다음처럼 하나의 문자 $x$로 표기한다.

$$ x = \begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \\ \end{bmatrix} $$

이때 벡터는 복수의 가로줄, 즉 행(row)을 가지고 하나의 세로줄, 즉 열(column)을 가지는 형태로 위에서 아래로 내려써서 표기해야 한다.

하나의 벡터를 이루는 데이터의 개수를 차원(dimension)이라고 한다. 위에서 예로 든 $x$는 4개의 실수로 이루어져 있으므로 4차원 실수 벡터라고 하고 다음처럼 표기한다.

$$ x \in \mathbf{R}^4 $$

만약 4개가 아니라 $N$개의 숫자가 모여 있는 경우의 표기는 다음과 같다.

$$ x = \begin{bmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{N} \\ \end{bmatrix} ,\;\;\;\; x \in \mathbf{R}^N $$

벡터의 원소가 되는 스칼라 값은 ${}_1$, ${}_2$ 등의 자연수 아래 첨자(sub-script)를 붙여서 원소의 위치를 표시한다. 하지만 자연수 아래 첨자가 있다고 무조건 스칼라는 아니다. 마찬가지로 벡터가 여러 개 있으면 서로 다른 벡터를 구별하기 위해 벡터 이름에 아래 첨자를 붙일 수도 있다. 따라서 아래 첨자를 가진 알파벳 소문자 기호는 스칼라일 수도 있고 벡터일 수도 있다. 두 경우는 문맥에 따라 구별해야 한다. 때에 따라서는 스칼라가 아닌 벡터라는 점을 강조하기 위해 볼드체 기호 $\mathbf{x}$를 사용하기도 한다.

$$ \mathbf{x} = \begin{bmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{N} \\ \end{bmatrix} $$

특징벡터

예를 들어 어떤 붓꽃 표본 한 송이를 꺾어 측정하였더니, 꽃잎의 길이가 5.1cm, 꽃잎의 폭이 3.5cm, 꽃받침의 길이가 1.5cm, 꽃받침의 폭이 0.2cm였다면 이 데이터 쌍을 $x_1$이라고 이름 붙이고 다음처럼 나타낼 수도 있다.

$$ x_1 = \begin{bmatrix} 5.1 \\ 3.5 \\ 1.4 \\ 0.2 \\ \end{bmatrix} \tag{5.1.1} $$

또 다른 붓꽃은 다음처럼 다른 데이터를 가질 수 있다.

$$ x_2 = \begin{bmatrix} 4.9 \\ 3.0 \\ 1.4 \\ 0.2 \\ \end{bmatrix} \tag{5.1.2} $$

만약 이 데이터를 이용하여 붓꽃의 종을 결정하는 예측 문제를 풀고 있다면 이러한 데이터 벡터를 특징 벡터(feature vector)라고 한다. NumPy를 사용하여 벡터를 표현할 때는 벡터를 열의 개수가 하나인 2차원 배열 객체로 표현하는 것이 올바르다. 예를 들어 위의 벡터 $x_1$을 NumPy로 표기하면 다음과 같다.

In [1]:
x1 = np.array([[5.1], [3.5], [1.4], [0.2]])
x1
Out:
array([[5.1],
       [3.5],
       [1.4],
       [0.2]])

하지만 NumPy는 1차원 배열 객체도 대부분 벡터로 인정한다. 이 때는 벡터가 마치 하나의 행처럼 표시되어도 실제로는 열이라는 점에 주의한다.

In [2]:
x1 = np.array([5.1, 3.5, 1.4, 0.2])
x1
Out:
array([5.1, 3.5, 1.4, 0.2])

그러나 벡터 데이터를 처리하는 프로그램에 따라서 두 가지 표현법 중 열 표기를 정확하게 요구하는 경우도 있으므로 주의해야 한다. 예를 들어 Scikit-learn 패키지에서 벡터를 요구하는 경우에는 반드시 열의 개수가 1개인 2차원 배열 객체를 넣어야 한다.

연습 문제 5.1.1

NumPy를 사용해서 붓꽃 데이터 $x_2$에 대한 벡터 변수 x2를 만든다.

예측 문제의 입력 데이터는 대부분 벡터로 표시한다. 예를 들어 숫자 이미지를 입력받아 어떤 숫자인지 분류하는 문제에서 이미지는 원래 2차원 데이터이지만 1차원 벡터로 변환할 수 있다. 다음은 8x8 차원의 숫자 0과 1 이미지 4개를 64차원의 벡터로 펼친 것이다. 같은 숫자에 대한 벡터가 서로 닮았다는 점에 주의하라.

In [3]:
from sklearn.datasets import load_digits

digits = load_digits()
samples = [0, 10, 20, 30, 1, 11, 21, 31]
d = []
for i in range(8):
    d.append(digits.images[samples[i]])

plt.figure(figsize=(8, 2))
for i in range(8):
    plt.subplot(1, 8, i + 1)
    plt.imshow(d[i], interpolation='nearest', cmap=plt.cm.bone_r)
    plt.grid(False); plt.xticks([]); plt.yticks([])
    plt.title("image {}".format(i + 1))
plt.tight_layout()
plt.show()
In [4]:
v = []
for i in range(8):
    v.append(d[i].reshape(64, 1))
    
plt.figure(figsize=(8, 8))
for i in range(8):
    plt.subplot(1, 8, i + 1)
    plt.imshow(v[i], aspect=0.4,
               interpolation='nearest', cmap=plt.cm.bone_r)
    plt.grid(False); plt.xticks([]); plt.yticks([])
    plt.title("vector {}".format(i + 1))
plt.tight_layout(w_pad=7)
plt.show()

행렬

행렬은 복수의 차원을 가지는 데이터 레코드가 다시 여러 개 있는 경우의 데이터를 합쳐서 표기한 것이다. 예를 들어 앞서 말한 붓꽃 예에서 6개의 붓꽃에 대해 크기를 측정하였다면 4차원 붓꽃 데이터가 6개가 있다. 즉, $4 \times 6 = 24$개의 실수 숫자가 있는 것이다. 이 숫자 집합을 행렬로 나타내면 다음과 같다. 행렬은 보통 $X$와 같이 알파벳 대문자로 표기한다.

$$ X = \begin{bmatrix} \boxed{\begin{matrix} x_{1, 1} & x_{1, 2} & x_{1, 3} & x_{1, 4}\end{matrix}} \\ \begin{matrix} x_{2, 1} & x_{2, 2} & x_{2, 3} & x_{2, 4}\end{matrix} \\ \begin{matrix} x_{3, 1} & x_{3, 2} & x_{3, 3} & x_{3, 4}\end{matrix} \\ \begin{matrix} x_{4, 1} & x_{4, 2} & x_{4, 3} & x_{4, 4}\end{matrix} \\ \begin{matrix} x_{5, 1} & x_{5, 2} & x_{5, 3} & x_{5, 4}\end{matrix} \\ \begin{matrix} x_{6, 1} & x_{6, 2} & x_{6, 3} & x_{6, 4}\end{matrix} \\ \end{bmatrix} $$

행렬의 원소 하나하나는 $x_{2, 3}$처럼 두 개의 숫자 쌍을 아래첨자(sub-script)로 붙여서 표기한다. 첫 번째 숫자가 행을 뜻하고 두 번째 숫자가 열을 뜻한다. 예를 들어 $x_{2, 3}$ 는 두번째 행(위에서 아래로 두번째), 세번째 열(왼쪽에서 오른쪽으로 세번째)의 숫자를 뜻한다. 행/열의 개수가 10보다 적을 때는 쉼표 없이 $x_{23}$ 라고 표기할 때도 있다.

벡터는 열의 수가 1인 행렬이라고 볼 수 있으므로 벡터를 다른 말로 열 벡터(column vector)라고도 한다.

데이터를 행렬로 묶어서 표시할 때는 붓꽃 하나에 대한 데이터 레코드, 즉 하나의 벡터가 열이 아닌 행(row)으로 표시한다. 붓꽃의 예에서는 하나의 데이터 레코드가 4차원 데이터였다는 점을 기억하자.

하나의 데이터 레코드를 단독으로 벡터로 나타낼 때는 하나의 열(column)로 나타내고 복수의 데이터 레코드 집합을 행렬로 나타낼 때는 하나의 데이터 레코드가 하나의 행(row)으로 표기하는 것은 얼핏 보기에는 일관성이 없어 보지만 추후 다른 연산을 할 때 이런 모양이 필요하기 때문이다. 데이터 분석에서 쓰는 일반적인 관례이므로 외워두어야 한다.

만약 이 데이터를 이용하여 붓꽃의 종을 결정하는 예측 문제를 풀고 있다면 이 행을 특징 행렬(feature matrix)이라고 하기도 한다. 이 행렬의 크기를 수식으로 표시할 때는 다음처럼 "행의 크기 곱하기 열의 크기"로 나타낸다.

$$ X \in \mathbf{R}^{6\times 4} $$

스칼라와 벡터도 수학적으로는 행렬에 속한다. 스칼라는 열과 행의 수가 각각 1인 행렬이고 벡터는 열의 수가 1인 행렬이다. 그래서 스칼라나 벡터의 크기를 표시할 때 행렬 표기에 따라서 다음처럼 쓸 수도 있다.

$$ a \in \mathbf{R}^{1\times 1} $$$$ x \in \mathbf{R}^{4\times 1} $$

앞에서 예로 들었던 두 송이의 붓꽃 데이터를 하나의 행렬로 합치면 다음과 같다.

$$ X= \begin{bmatrix} 5.1 & 3.5 & 1.4 & 0.2 \\ 4.9 & 3.0 & 1.4 & 0.2 \\ \end{bmatrix} \tag{5.1.3} $$

NumPy를 이용하여 행렬을 표기할 때는 2차원 ndarray 객체를 사용한다. 예를 들어 다음 행렬 $A$를 NumPy로 나타내면 다음과 같다.

$$ A= \begin{bmatrix} 11 & 12 & 13 \\ 21 & 22 & 23 \\ \end{bmatrix} $$
In [5]:
A = np.array([[11,12,13],[21,22,23]])
A
Out:
array([[11, 12, 13],
       [21, 22, 23]])

연습 문제 5.1.2

NumPy를 사용해서 붓꽃 데이터 $X$에 대한 행렬 변수 X를 만든다.

전치 연산

이번에는 이러한 스칼라, 벡터, 행렬 데이터를 변형시키는 방법 즉, 연산(operation)에 대해서 알아보자. 전치(transpose) 연산은 행렬에서 가장 기본이 되는 연산으로 행렬의 행과 열을 바꾸는 연산을 말한다. 전치 연산은 벡터나 행렬에 $T$라는 위첨자(super-script)를 붙어서 표기한다. 책에 따라서는 프라임(prime)기호 $'$를 붙이는 경우도 있다.

$$ x \;\; \rightarrow \;\; x^T \text{ 또는 } x' $$

예를 들어 앞에서 보인 $6\times 4$ 차원의 행렬을 전치 연산하면 $4\times 6$ 차원의 행렬이 된다.

$$ X = \begin{bmatrix} \boxed{\begin{matrix} x_{1, 1} & x_{1, 2} & x_{1, 3} & x_{1, 4}\end{matrix}} \\ \begin{matrix} x_{2, 1} & x_{2, 2} & x_{2, 3} & x_{2, 4}\end{matrix} \\ \begin{matrix} x_{3, 1} & x_{3, 2} & x_{3, 3} & x_{3, 4}\end{matrix} \\ \begin{matrix} x_{4, 1} & x_{4, 2} & x_{4, 3} & x_{4, 4}\end{matrix} \\ \begin{matrix} x_{5, 1} & x_{5, 2} & x_{5, 3} & x_{5, 4}\end{matrix} \\ \begin{matrix} x_{6, 1} & x_{6, 2} & x_{6, 3} & x_{6, 4}\end{matrix} \\ \end{bmatrix} \;\; \rightarrow \;\; X^T = \begin{bmatrix} \boxed{\begin{matrix} x_{1, 1} \\ x_{1, 2} \\ x_{1, 3} \\ x_{1, 4}\end{matrix}} & \begin{matrix} x_{2, 1} \\ x_{2, 2} \\ x_{2, 3} \\ x_{2, 4}\end{matrix} & \begin{matrix} x_{3, 1} \\ x_{3, 2} \\ x_{3, 3} \\ x_{3, 4}\end{matrix} & \begin{matrix} x_{4, 1} \\ x_{4, 2} \\ x_{4, 3} \\ x_{4, 4}\end{matrix} & \begin{matrix} x_{5, 1} \\ x_{5, 2} \\ x_{5, 3} \\ x_{5, 4}\end{matrix} & \begin{matrix} x_{6, 1} \\ x_{6, 2} \\ x_{6, 3} \\ x_{6, 4}\end{matrix} & \end{bmatrix} $$

전치 연산으로 만든 행렬을 원래 행렬에 대한 전치행렬이라고 한다. (열)벡터 $x$에 대해 전치 연산을 적용하여 만든 $x^T$는 행의 수가 1인 행렬이므로 행 벡터(row vector)라고 한다.

$$ x = \begin{bmatrix} x_{1} \\ x_{2} \\ \vdots \\ x_{N} \\ \end{bmatrix} \; \rightarrow \; x^T = \begin{bmatrix} x_{1} & x_{2} & \cdots & x_{N} \end{bmatrix} $$

NumPy에서는 ndarray 객체의 T라는 속성을 이용하여 전치 행렬을 구한다. 이 때 T는 메서드(method)가 아닌 속성(attribute)이므로 소괄호 ()를 붙여서 호출하면 안된다.

In [6]:
A.T
Out:
array([[11, 21],
       [12, 22],
       [13, 23]])

다만 1차원 ndarray는 전치 연산이 정의되지 않는다.

In [7]:
x1
Out:
array([5.1, 3.5, 1.4, 0.2])
In [8]:
x1.T
Out:
array([5.1, 3.5, 1.4, 0.2])

연습 문제 5.1.3

  1. NumPy를 사용해서 붓꽃 데이터 $X$의 전치행렬 $X^T$을 구한다.
  2. NumPy를 사용해서 위 전치행렬을 다시 전치한 행렬 $(X^T)^T$을 구한다. 이 행렬과 원래 행렬 $X$을 비교한다.

행렬의 행 표기법과 열 표기법

전치 연산과 행 벡터, 열 벡터를 이용하면 다음처럼 행렬을 복수의 열 벡터 $c_i$, 또는 복수의 행 벡터 $r_j^T$ 을 합친(concatenated) 형태로 표기할 수도 있다.

$$ X = \begin{bmatrix} c_1 & c_2 & \cdots & c_M \end{bmatrix} = \begin{bmatrix} r_1^T \\ r_2^T \\ \vdots \\ r_N^T \\ \end{bmatrix} $$

위 식에서 행렬과 벡터의 크기는 다음과 같다.

$$ X \in \mathbf{R}^{N\times M}$$$$c_i \in \mathbf{R}^{N \times 1} \; (i=1,\cdots,M)$$$$r_j^T \in \mathbf{R}^{1 \times M} \; (j=1,\cdots,N) $$

벡터의 모양을 직사각형으로 표시하면 다음과 같다.

$$ X = \begin{bmatrix} \boxed{\,c_1\!\phantom{\dfrac{\raise 1.0em \mathstrut}{\lower 1.0em \mathstrut}}} \!\!\!\!& \boxed{\,c_2\!\phantom{\dfrac{\raise 1.0em \mathstrut}{\lower 1.0em \mathstrut}}} \!\!\!\!& \cdots \!\!\!\!& \boxed{c_M\!\!\phantom{\dfrac{\raise 1.0em \mathstrut}{\lower 1.0em \mathstrut}}} \!\!\!\!\!\!& \end{bmatrix} = \begin{bmatrix} \boxed{\;\;\;\;\;\;\;\; r_1^T \lower 0.3em \mathstrut \;\;\;\;\;\;\;\;} \\ \boxed{\;\;\;\;\;\;\;\; r_2^T \lower 0.3em \mathstrut \;\;\;\;\;\;\;\;} \\ \vdots \\ \boxed{\;\;\;\;\;\;\;\; r_N^T \lower 0.3em \mathstrut \;\;\;\;\;\;\;\;} \\ \end{bmatrix} $$

위의 식은 다음과 같은 명제를 수식으로 표현한 것이다.

"행렬 $X$의 각 열은 $c_1$, $c_2$, $\ldots$, $c_M$라고 이름 붙인다."

또는

"행렬 $X$는 열 벡터 $c_1$, $c_2$, $\ldots$, $c_M$으로 이루어져 있다."

행 관점에서는

"행렬 $X$의 각 행은 $r_1^T$, $r_2^T$, $\ldots$, $r_N^T$라고 이름 붙인다."

또는

"행렬 $X$는 행 벡터 $r_1^T$, $r_2^T$, $\ldots$, $r_N^T$으로 이루어져 있다."

모든 벡터는 기본적으로 열벡터이므로 $r_i$를 전치 연산하여 $r_i^T$라고 행을 표현한 점에 주의한다.

예를 들어 행렬 $$ X= \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} $$ 은 열 벡터 $$ c_1= \begin{bmatrix} 1 \\ 4 \end{bmatrix}, \; c_2= \begin{bmatrix} 2 \\ 5 \end{bmatrix}, \; c_3= \begin{bmatrix} 3 \\ 6 \end{bmatrix} $$ 이 합쳐진 것이라고 보거나

또는 행 벡터 $$ r_1= \begin{bmatrix} 1 & 2 & 3 \end{bmatrix}^T, \; r_2= \begin{bmatrix} 4 & 5 & 6 \end{bmatrix}^T $$ 로 구성되었다고 볼 수 있다.

특수한 벡터와 행렬

몇가지 특수한 벡터와 행렬은 별도의 기호나 이름이 붙는다.

영벡터

모든 원소가 0인 $N$차원 벡터는 영벡터(zeros-vector)라고 하며 다음처럼 표기한다.

$$ \mathbf{0}_N = \mathbf{0} = 0 = \begin{bmatrix} 0 \\ 0 \\ \vdots \\ 0 \\ \end{bmatrix} $$$$ 0 \in \mathbf{R}^{N \times 1} $$

문맥으로 벡터의 크기를 알 수 있을 때는 크기를 나타내는 아래 첨자 $N$을 생략할 수 있다.

일벡터

모든 원소가 1인 $N$차원 벡터는 일벡터(ones-vector)라고 하며 다음처럼 표기한다.

$$ \mathbf{1}_N = \mathbf{1} = 1 = \begin{bmatrix} 1 \\ 1 \\ \vdots \\ 1 \\ \end{bmatrix} $$$$ 1 \in \mathbf{R}^{N \times 1} $$

마찬가지로 문맥으로 벡터의 크기를 알 수 있을 때는 크기를 나타내는 아래 첨자 $N$을 생략할 수 있다.

정방행렬

행의 개수와 열의 개수가 같은 행렬을 정방행렬(square matrix)이라고 한다.

대각행렬

행렬에서 행과 열이 같은 위치를 주 대각(main diagonal) 또는 간단히 대각(diagonal)이라고 한다. 대각 위치에 있지 않은 것들은 비대각(off-diagonal)이라고 한다. 모든 비대각 요소가 0인 행렬을 대각행렬(diagonal matrix)이라고 한다.

$$ D = \begin{bmatrix} d_{1} & 0 & \cdots & 0 \\ 0 & d_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & d_{N} \\ \end{bmatrix} $$$$ D \in \mathbf{R}^{N \times N} $$

대각행렬이 되려면 비대각성분이 0이기만 하면 되고 대각성분은 0이든 아니든 상관없다. 또한 반드시 정방행렬일 필요도 없다. 예를 들어 다음 행렬도 대각행렬이라고 할 수 있다.

$$ D = \begin{bmatrix} d_{1} & 0 & \cdots & 0 \\ 0 & d_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & d_{M} \\ 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 \\ 0 & 0 & \cdots & 0 \\ \end{bmatrix} $$$$ D \in \mathbf{R}^{N \times M} $$

NumPy로 대각 정방행렬을 생성하려면 diag 명령을 사용한다.

In [9]:
np.diag([1, 2, 3])
Out:
array([[1, 0, 0],
       [0, 2, 0],
       [0, 0, 3]])

항등행렬

대각행렬 중에서도 모든 대각성분의 값이 1인 대각행렬을 항등행렬(identity matrix)이라고 한다. 항등행렬은 보통 알파벳 대문자 $I$로 표기한다.

$$ I = \begin{bmatrix} 1 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \\ \end{bmatrix} $$$$ I \in \mathbf{R}^{N \times N} $$

NumPy로 항등행렬을 생성하려면 identity 혹은 eye 명령을 사용한다.

In [10]:
np.identity(3)
Out:
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
In [11]:
np.eye(4)
Out:
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

대칭행렬

만약 전치연산을 통해서 얻은 전치행렬과 원래의 행렬이 같으면 대칭행렬(symmetric matrix)이라고 한다. 정방행렬만 대칭행렬이 될 수 있다.

$$ S^{T} = S $$

$$ S \in \mathbf{R}^{N \times N} $$

연습 문제 5.1.4

  1. 영벡터, 일벡터, 정방행렬, 대각행렬, 항등행렬, 대칭행렬의 예를 하나씩 만들어 본다.
  2. 위의 벡터와 행렬을 NumPy로 나타내 본다.

질문/덧글

[데사스] 행렬의 곱셈 질문있습니다. song*** 2016년 5월 16일 8:28 오후

하다보니 2*2*3 행렬과 2*2*3 행렬을 곱해봤는데
이런 값이 나오는 원리를 모르겠습니다.

a = np.array([[[1,2,3],[4,6,7]],[[7,8,9],[10,11,12]]])

array([[[ 1, 2, 3],
[ 4, 6, 7]],

[[ 7, 8, 9],
[10, 11, 12]]])

b = np.array([[[1,2,3],[4,6,7]],[[7,8,9],[10,11,12]]])

array([[[ 1, 2, 3],
[ 4, 6, 7]],

[[ 7, 8, 9],
[10, 11, 12]]])

np.dot(a.T,b)

array([[[[ 29, 44, 52],
[ 77, 85, 93]],

[[ 44, 68, 82],
[128, 142, 156]]],

[[[ 34, 52, 62],
[ 94, 104, 114]],

[[ 50, 78, 95],
[152, 169, 186]]],

[[[ 39, 60, 72],
[111, 123, 135]],

[[ 55, 86, 105],
[169, 188, 207]]]])

답변: 행렬의 곱셈 질문있습니다. 관리자 2016년 5월 17일 7:03 오전

1. 우선 a와 b를 곱한 것이 아니고 a^T와 b를 곱하였으므로 (3, 2, 2) x (2, 2, 3) 입니다.
2. 3차원 이상의 배열은 행렬(matrix)이 아니고 텐서(tensor)입니다. 여기에서는 텐서 연산에 대해서는 정의하지 않았습니다.
3. numpy.dot 연산은 3차원 이상의 배열에 대해 다음과 같이 정의하고 있습니다.
[link](https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html)
For N dimensions it is a sum product over the last axis of a and the second-to-last of b: dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
이 연산은 텐서 축소(tensor contraction)이라는 연산입니다.

사용자에 의해 삭제되었습니다. supe*** 2016년 9월 20일 7:51 오후

사용자에 의해 삭제되었습니다.

이차형식에서 supe*** 2016년 10월 24일 10:48 오전

np.dot(np.dot(x, A), x) 를
np.dot(np.dot(x,A), x.T)로 표기 하지 않은 이유가 있는지 궁금합니다.

답변: 이차형식에서 관리자 2016년 10월 24일 10:53 오후

어차피 x가 1차원 배열이므로 T 연산이 아무 의미가 없습니다.

가중 행렬합 부분에서 질문드립니다. hoba*** 2017년 1월 22일 1:29 오전

혹시 가중 행렬합 부분에서 마지막에 행 벡터로 표현한 행렬에서 마지막 줄이 N이 아니고 M인것 같아서 질문드립니다.

감사합니다.

답변: 가중 행렬합 부분에서 질문드립니다. 관리자 2017년 1월 22일 10:27 오전

수정하였습니다. 지적해 주셔서 고맙습니다.

행렬의 행 표기법과 열 표기법 에서 문의드립니다. fudi*** 2017년 4월 19일 11:18 오전

행 벡터로의 표기부분에서

rjT∈R1×M(j=1,⋯,N)

이부분이 R^Mx1 이 아닌지요?

답변: 행렬의 행 표기법과 열 표기법 에서 문의드립니다. 관리자 2017년 4월 19일 12:48 오후

아닙니다. $r$ 자체는 열벡터이고 $r^T$가 행벡터입니다.

감사합니다. rlaw*** 2018년 9월 5일 9:43 오후

대각행렬이 되려면 "대각성분"이 0이기만 하면 된다 => 대각행렬이 되려면 "비대각성분"이 0이기만 하면 된다.

답변: 감사합니다. 관리자 2018년 9월 6일 1:57 오후

지적 감사드립니다. 곧 수정하겠습니다.