본문 바로가기
 
 
 
카테고리 없음

파이썬 행렬곱의 모든 것

by mooonstory 2025. 2. 11.

 
반응형

파이썬은 데이터 과학 및 인공지능과 같은 분야에서 널리 사용되는 언어이며, 행렬 연산은 이러한 분야에서 핵심적인 역할을 합니다. 행렬곱은 두 행렬의 곱을 구하는 연산으로, 벡터 연산 및 딥러닝 네트워크의 기본 구성 요소입니다. 이 글에서는 **파이썬에서 행렬곱을 수행하는 다양한 방법**과 **실용적인 예제**를 통해 행렬곱을 좀 더 깊이 이해할 수 있도록 도와드리겠습니다.

1. 행렬곱의 기초

행렬곱은 두 행렬의 내적(dot product)입니다. 두 개의 행렬 A와 B가 있을 때, 행렬 A의 열 수가 행렬 B의 행 수와 같아야 곱할 수 있습니다. 예를 들어, A가 (m x n) 형태이고 B가 (n x p) 형태라면, 결과 행렬 C는 (m x p) 형태가 됩니다.

예를 들어, 아래와 같은 두 행렬을 고려해보세요:

    A = [[1, 2, 3],
         [4, 5, 6]]

    B = [[7, 8],
         [9, 10],
         [11, 12]]
    

A와 B의 행렬곱 C는 다음과 같습니다:

    C = [[58, 64],
         [139, 154]]
    

이러한 행렬곱을 파이썬에서 어떻게 구현하는지 살펴보겠습니다.

2. NumPy를 이용한 행렬곱

파이썬에서 행렬곱을 가장 쉽게 수행할 수 있는 라이브러리는 NumPy입니다. NumPy는 많은 수학 계산을 위한 최적화된 기능을 제공하고, 배열과 행렬 연산에 매우 유용합니다.

NumPy를 사용하여 위의 행렬 A와 B를 곱하는 코드는 다음과 같습니다:

    import numpy as np

    A = np.array([[1, 2, 3],
                  [4, 5, 6]])

    B = np.array([[7, 8],
                  [9, 10],
                  [11, 12]])

    C = np.dot(A, B)
    print(C)  # [[58  64]
               #  [139 154]]
    

이와 같이 NumPy를 사용하면 행렬곱을 간편하게 수행할 수 있습니다. NumPy의 dot() 함수는 행렬곱을 위해 매우 유용합니다.

3. 직접 구현하기

NumPy를 사용하지 않고 행렬곱을 구현하는 방법도 있습니다. 행렬곱의 원리를 이해하기 위해 아래와 같이 직접 구현해보겠습니다:

    def matrix_multiply(A, B):
        if len(A[0]) != len(B):
            raise ValueError("두 행렬의 곱셈이 불가능합니다.")

        result = [[0 for _ in range(len(B[0]))] for _ in range(len(A))]
        
        for i in range(len(A)):
            for j in range(len(B[0])):
                for k in range(len(B)):
                    result[i][j] += A[i][k] * B[k][j]
        
        return result

    A = [[1, 2, 3],
         [4, 5, 6]]
    B = [[7, 8],
         [9, 10],
         [11, 12]]

    C = matrix_multiply(A, B)
    print(C)  # [[58, 64], [139, 154]]
    

위와 같이 행렬곱을 정의하면, 인자의 크기를 확인하고, 행렬의 곱셈을 구성하는 기본 원리에 따라 각 요소를 계산하게 됩니다. 이러한 방식은 행렬곱을 이해하는 데 큰 도움이 됩니다.

4. 행렬 곱의 성질

행렬곱은 몇 가지 흥미로운 성질을 가지고 있습니다. 가장 많이 알려진 성질 중 하나는 **결합법칙**입니다. 즉, (AB)C = A(BC)가 성립합니다. 이 외에도 **분배법칙**과 **단위행렬의 존재**라는 두 가지 중요한 성질도 있습니다.

예를 들면, 다음과 같은 두 행렬을 고려해보겠습니다:

    A = [[1, 2],
         [3, 4]]

    B = [[5, 6],
         [7, 8]]

    C = [[1, 0],
         [0, 1]]  # 단위 행렬
    

이 때 A와 B의 순서를 변경해도 곱의 결과는 다를 수 있습니다. 그러나 (AB)C와 A(BC)는 동일하게 결과가 나타납니다.

5. 성능 최적화 및 실용적인 팁

행렬곱은 특히 대규모 데이터셋에서 연산 비용이 높기 때문에 성능 최적화가 중요합니다. **NumPy**를 사용하면 C와 같은 저수준 언어로 구현된 성능을 활용할 수 있어 일반적으로 더 빠릅니다.

또한, **브로드캐스팅** 기능을 활용하면 차원이 다른 행렬 간의 연산을 보다 간편하게 수행할 수 있습니다. 예를 들어:

    A = np.array([[1, 2], [3, 4]])
    B = np.array([[2], [3]])

    C = A @ B  # 브로드캐스팅을 사용한 행렬곱
    print(C)  # [[ 8]
               #  [18]]
    

이와 같이 모델을 최적화하고 성능 향상을 위한 팁을 익히면, 대규모 데이터셋 처리 시 큰 도움이 됩니다.

6. 결론 및 다음 단계


이번 글에서는 파이썬에서 행렬곱을 수행하는 다양한 방법, 성질, 성능 최적화에 대해 알아보았습니다. 행렬곱은 데이터 과학, 기계 학습 등 다양한 분야에서 필수적인 도구이므로, 익혀두면 많은 도움이 될 것입니다. 앞으로는 이러한 기초 지식을 바탕으로, 더 복잡한 행렬 연산이나 다양한 머신 러닝 알고리즘에 대한 이해를 넓힐 수 있습니다.

**행렬곱의 이해는 여러분이 다루는 데이터의 구조와 관계를 이해하는 데 중요한 기초가 될 것입니다.** 새로운 지식을 지속적으로 쌓아가며 더 발전해 나가길 바랍니다!

반응형