[Week 2]Day 6 Numpy/ベクトル/行列


📒 Numpy


これはNumpyの基礎授業です.
Numpyは一度ネットで簡単に勉強したことがあります.
教授は最初から最後まで一つ一つ私を指図してくれた.
頭の中の内容を整理するのは簡単すぎる.

📝 numpy


」マトリクスとマトリクスをコードで表すにはどうすればいいですか?

✏️ Why needs?

coefficient_matrix = [[2, 2, 1], [2, -1, 2], [1, -1, 2]]
constant_vector = [9, 6, 5]
  • はどのようにして様々なマトリクス計算を作成しますか?
  • は非常に大きな行列
  • を表す.
  • 処理速度問題-Pythonは解釈言語
  • である.
    👉 適切な包装が必要です.

    ✏️ numpy(Numerica Python)

  • Python高性能科学コンピューティングパッケージ
  • アレイ演算の標準(線形代数)、例えば
  • 行列およびVector
  • の一般的なリストに比べて、高速でメモリ効率が向上します.
  • は、データ配列に対する重複文を必要としない処理をサポートする.
  • # 패키지 설치
    activate ml
    conda install numpy
    # 호출
    import numpy as np

    ✏️ ndarray

  • numpyはnpです.array関数を用いて配列を生成する.
  • 配列に格納できるデータ型は
  • 個のみです.(声明)
  • ダイナミックタイプはサポートされていません.(Cアレイ使用)
  • >>> test_aray = np.array([1, 4, 5, 8], float) # (리스트, 타입)
    >>> print(test_array)
    array([1. , 4. , 5. , 8.])
    >>> type(test_array)
    numpy.ndarray
    >>> type(test_array[3])
    numpy.float64

    ✏️ Array creation

  • 形状:numpy配列の次元構成
  • を返す
  • dtype:numpy arrayは、データ型
  • を返します.
    >>> test_array = np.array([1, 4, 5, "8"]) # String Type의 데이터를 입력해도
    >>> print(test_array)
    array([1., 4., 5., 8.])
    >>> print(type(test_array[3])) # Float Type으로 자동 형변환
    numpy.float64
    >>> print(test_array.dtype) # Array 전체의 데이터 Type을 반환
    dtype('float64')
    >>> print(test_array.shape) # Array의 shape를 반환 (Dimension)
    (4,)

    ✏️ Array shape


    arrayのRANKによると名前があります.
    RankNameExample0scalar71vector[10, 10]2matrix[[10, 10,], [15, 15]]33-tensor[[[1, 5, 9], [2, 6, 10]], [[3, 7, 11], [4, 8, 12]]]nn-tensor

    ✏️ Array dtype


    Cのデータ型と互換性があります.

    📝 numpy2


    ✏️ reshape


    Arrayシェイプのサイズを変更します.要素の個数は同じです.
    >>> test_matrix = [[1, 2, 3, 4], [1, 2, 5, 8]]
    >>> np.array(test_matrix).shape
    (2, 4)
    >>> np.array(test_matrix).reshape(8,)
    array[1, 2, 3, 4, 1, 2, 5, 8]
  • 個-1を入れると、大きさに合わせて自分で形を整えます.
  • フラット->多次元配列は、1次元配列
  • を返します.

    ✏️ Indexing

  • Listとは異なり、2次元配列に[0,0]タグが与えられる.
  • 行列は前の行、後の列を表す.
  • >>>  a = np.array([[1, 2, 3], [4, 5, 6]], int)
    >>> print(a[1, 2])
    6
    >>> a[0, 0] = 0
    >>> print(a)
    array([[0, 2, 3], [4, 5, 6]])

    ✏️ Slicing

  • Listとは異なり、行と列をスライスすることができる.
  • 行列の部分集合を抽出する場合に便利です.
  • >>> a = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], int)
    >>> a[:, 2:] # 전체 Row의 2열 이상
    array([[3, 4, 5], [8, 9, 10]])
    >>> a[1, 1:3] # 1 Row의 1열 ~ 2열
    array([7, 8])
    >>> a[1:3] # 1Row ~ 2Row의 전체
    array([6, 7, 8, 9, 10])

    ✏️ Creation function

  • arange:arrayの範囲は、値のリスト
  • を生成する.
    np.arange(5) # List의 range와 같은 효과, integer로 0부터 4까지 배열 추출
    # array([0, 1, 2, 3, 4])
    np.arange(0, 3, 0.5) # (시작, 끝, step)으로, floating point도 표시 가능
    # array([0., 0.5, 1., 1.5, 2, 2.5])
    np.arange(4).reshape(2, 2)
    # array([[0, 1], [2, 3]])
  • 0:0で満たされたカレンダー
  • を作成
  • ones:1の生成
  • empty:形状のみが空の仕様
  • を生成する.
  • something like(カレンダー):既存のカレンダーの形状と同じサイズの1、0または空の配列
  • を返します.
    np.zeros(shape=(5,), dtype=np.int8)
    # array([0, 0, 0, 0, 0], dtype = int8)
    np.ones((2, 2))
    # array([[1, 1], [1, 1]])
  • identity:単位行列(i行列)
  • を作成する
    >>> np.identity(3)
    array([1., 0., 0.],
          [0., 1., 0.],
          [0., 0., 1.]])
  • 目:対角線が1のマトリクスで、K値の開始インデックス
  • を変更できます.
    np.eye(3, 5, k = 2)
    array([0., 0., 1., 0., 0.],
          [0., 0., 0., 1., 0.],
          [0., 0., 0., 0., 1.]])
  • diag:対角行列の値を抽出(開始インデックスをK値に設定可能)
    k値が正の場合は右、負の場合は下
  • matrix = np.arange(9).reshape(3, 3)
    np.diag(matrix)
    # array([0, 4, 8])
  • random.unitform(開始値、終了値、size):均一分布
  • random.normal(開始値、終了値、size):正規分布
  • ✏️ axis

  • すべての操作関数を実行するときの寸法軸
  • a = a[np.newaxis, :] # 값은 그대로면서, 축을 하나 늘려준다.
    a.T # T를 붙여주면 행과 열을 바꿔준다.
    🧤 np.何かを呼び出すことで、さまざまな数学演算子を決定できます.

    ✏️ concatenate

  • numpy arrayを組み合わせた関数
  • ✏️ array operation


    numpyは配列間の基本的な4則演算をサポートします.(同じ形状でなければなりません)
    >>> a = np.array([[1, 2, 3], [4, 5, 6]])
    >>> a + a
    array([[2, 4, 6], [8, 10, 12]])
    >>> a - a
    array([[0, 0, 0], [0, 0, 0]])
    >>> a * a
    array([[1, 4, 9], [16, 25, 36]])
    Dot Product、すなわち
  • 行列の基本演算もサポートします.
  • >>> a = np.arange(1, 7).reshape(2, 3)
    >>> b = np.arange(7, 13).reshape(3, 2)
    >>> a.dot(b)
    array([[58, 64], [139, 154]])
  • 行列からScalar、Vector-Metrixまでの演算もサポートされています.
  • 📝 numpy3


    ✏️ Comparisons


    配列サイズが同じである場合、要素間の比較結果はBoolean typeを返します.
    >>> a = np.array([1, 3, 0])
    >>> b = np.array([5, 2, 1])
    >>> a > b
    array([False, True, False], dtype=bool)
    >>> (a > b).any()
    True
  • np.where(a > 0, 3, 2) # where(condition, True, False)
    np.where(a > 0) # True 값의 index들을 반환
    a = np.array([1, np.Nan, np.Inf], float)
    np.isnan(a) # Not a Number
    np.isfinite(a) # is finite number
    
    np.argmax(a), np.argmin(a) # 최대값, 최소값의 index를 반환함
    np.argmax(a, axis = 1), np.argmin(a, axis = 0) # axis 기반의 반환
    a.argsort() # 작은 값부터 index를 반환
    a[a.argsort()[::-1]] # 내침차순

    ✏️ Boolean & fancy index

  • Boolean indexは、特定の条件に従って配列形式で値を抽出する.
  • Comparison演算子も使用できます.
  • >>> a = np.array([1, 4, 0, 2, 3, 5], float)
    >>> a[a > 3] # 조건이 True인 index의 element만 추출
    array([4.0, 5.0])
  • numpyはarrayをインデックス値として使用し、値を抽出できます.
  • マトリックス形式のデータであってもよい.
  • >>> a = np.array([2, 4, 6, 8], float)
    >>> b = np.array([0, 0, 1, 3, 2, 1], int) # 반드시 integer로 선언
    >>> a[b] # bracket index, b 배열의 값을 index로 하여 a의 값들을 추출함.
    # a.take(b) -> take 함수 : 윗 줄 문법과 같은 효과
    array([2., 2., 4., 8., 6., 4.])

    ✏️ Numpy data I/O


    テキスト型データの読み取りと格納機能
    a = np.loadtxt("파일명")
    a_int = a.astype(int) # int type 변환
    np.savetgxt("파일명", a_int, fmt="%.2e", delimiter=",") # csv로 저장

    📒 ベクトルは何ですか。


    講師はUNIXの任成彬教授に変わった.
    これはベクトルの数学的内容+python実現に関する講座である.
    幾何学、ベクトル、または線形代数を学ぶのは長い間、新しい概念のように感じられています.
    今は数学の勉强をがんばります.

    📝 vector

  • の数字を要素とするlistまたは配列.
  • 空間で一点を表す.
  • 原点から相対位置を表します.
  • # 1차원 벡터 예시
    x = np.array([1, 7, 2]) # 행 벡터
    x.T # 열 벡터
  • の数字を乗算し、長さだけを変更します.(スカラー乗算)
  • ベクトル同士が同じ形状であれば4則演算が可能である.
  • 📝 ベクトル賭博

  • ベクトルのギャンブル(norm)とは、原点からの距離を指す.
  • の任意の次元dに対して成立する.
  • L 1賭けに各成分変化量の絶対値を加える.
  • L 2賭博はピタゴラスの定理を用いてユークリッド距離を計算した.
  • def L1_norm(x):
        x_norm = np.abs(x)
        x_norm = np.sum(x_norm)
        return x_norm
    
    # np.linalg.norm을 이용해도 구현할 수 있다.
    def L2_norm(x):
        x_norm = x * x
        x_norm = np.sum(x_norm)
        x_norm = np.sqrt(x_norm)
        return x_norm
  • 賭博の種類は異なり、その幾何学的性質も異なる.
  • 2つのベクトル間の距離は、
  • L 1、L 2賭けを用いて計算することができる.
  • 2つのベクトル間の距離を計算するときに、ベクトルの減算を使用します.
  • の第2の余弦法則によれば、2つのベクトル間の角度を計算することができる.
  • def angle(x, y):
        v = np.inner(x, y) / (L2_norm(x) * L2_norm(y))
        theta = np.arccos(v)
        return theta

    📒 [解答]ベクトル-1~5


    5/5 Solve

    📝 Q1


    Q)次のベクトルのL 1-賭け(整数値入力)を求める
    x = [-1, 2, -3]
    A) 1 + 2 + 3 = 6

    📝 Q2


    Q)次のベクトルのL 2-賭け(整数値入力)を求める
    x = [-6, -8]
    A) sqrt(36 + 64) = sqrt(100) = 10

    📝 Q3


    Q)L 2-ギャンブルを用いて2つのベクトル間の距離を求める(整数値入力)
    x = [-3, 0]
    y = [0, 4]
    A) L2(x - y) = L2([-3, -4]) = sqrt(9 + 16) = sqrt(25) = 5

    📝 Q4


    Q)2つのベクトルの間の挟み角(入力アーク単位:0以上、7未満の整数値)を求める
    x = [0, 1]
    y = [0, 2]
    A) θ = 内在(x,y)/(L 2(x)*L 2(y)=2/(1*2)=1.
    -> arccos(θ) = arccos(1) = 0

    📝 Q5


    Q)内積が次のように定義される場合:
    <x, y> = ||x||₂||y||₂cos(θ)
    
    x = [1, -1, 1, -1]
    y = [4, -4, 4, -4]
    A) L2(x) * L2(y) * cos(θ) = 2 * 8 * 1 = 16

    📒 チームは何ですか。


    理論はすべて理解したが、最後の応用部分を聞いてもあまり理解できなかった.
    マトリックス演算は深さ学習の核心だそうです.
    モデルを直接実現するには、本当に重要な部分のようです.
    自分を理論から応用に導くためには、多くの勉強が必要らしい.

    📝 列

  • 行列は、ベクトルを要素とする2次元アレイである.
  • numpyでは、行ベクトルを要素を有する2次元配列と見なすことが望ましい.
  • 行列には、行(行)と列(列)というインデックスがあります.
  • プリアンブル行列は、行および列のインデックスが変更された行列を意味する.
  • 行列は同じ形状を有し、加算、減算、成分乗算、スカラー乗算ともによい.
  • 📝 マトリックス演算


    ▼▼行列乗算

  • 行列は、i第1行ベクトルとj第1列ベクトルとの間の内積を成分とする行列を乗じたものである.
  • 行列積によりベイカーモードを抽出してもよいし、データを圧縮してもよい.
  • X = np.array([[1, -2, 3],
                  [7, 5, 0],
                  [-2, -1, 2]])
    Y = np.array([[0, 1],
                  [1, -1],
                  [-2, 1]])
    >>> X @ Y # numpy에선 @ 연산을 사용한다.
    array([[-8, 6],
           [5, 2],
           [-5, 1]])

    ▼▼マトリックス内積

  • numpyのnp.Innerは、i第1行ベクトルとj第1行ベクトルとの間の内積を成分のマトリクスとして計算する.
  • ▼▼逆行列

  • ある行列Aの演算を逆算した行列を逆行列と呼ぶ.
  • 逆行列は、行列数が等しく、行列式(行列式)がゼロでない場合にのみ計算できます.
  • X = np.array([1, -2, 3],
                 [7, 5, 0],
                 [-2, -1, 2]])
    np.linalg.inv(X) # 역행렬 구하기
  • 逆行列が計算できない場合、類似逆行列(pseudo-reverse)またはmoore-penrose逆行列が使用される.
  • X = np.array([[0, 1],
                  [1, -1],
                  [-2, 1]])
    np.linalg.pinv(X) # 유사 역행렬 구하기

    📝 適用


    ▼▼▼連立方程式を解く



    ▼▼線形回帰分析



    📒 [解答]マトリックス-1~5


    5/5 Solve

    📝 Q1


    Q)マトリクスXの正しい前置マトリクスを以下のオプションで選択してください.
      X = [[1, 2, 3],
           [4, 5, 6]
           [7, 8, 9]]
    
      1. [[3, 2, 1],
          [6, 5, 4],
          [9, 8, 7]]  
        
    ✔️2. [[1, 4, 7],
          [2, 5, 8],
          [3, 6, 9]]
        
      3. [[9, 8, 7],
          [6, 5, 4],
          [3, 2, 1]]
        
      4. [[7, 8, 9],
          [4, 5, 6],
          [1, 2, 3]]
        
      5. [[1, 0, 0],
          [0, 1, 0],
          [0, 0, 1]]

    📝 Q2


    Q)2つの行列の積は、各行列の形状とは無関係であってもよい.
    A)いいえ

    📝 Q3


    Q)任意の行列の逆行列は常に計算可能である.
    A)いいえ

    📝 Q4


    Q)マトリクスXの正しい逆マトリクスを以下のオプションで選択してください.
    X = [[1, 0, 1],
         [0, 1, 0]
         [1, 1, 0]]
    
      1. [[1, 0, 0],
          [0, 1, 0],
          [0, 0, 1]]  
        
      2. [[1, 0, 1],
          [0, 1, 0],
          [1, 1, 0]]
        
      3. [[1, 0, 1],
          [0, 1, 1],
          [1, 0, 0]]
        
    ✔️4. [[0, -1, 1],
          [0, 1, 0],
          [1, 1, -1]]
        
      5. [[0, -1, 1],
          [-1, 1, 0],
          [1, 0, -1]]

    📝 Q5


    Q)マトリクスXの正しいモール・ペンロス逆マトリクスを以下のオプションで選択してください.
    X = [[1, 0, 1],
         [0, 1, 0]]
    
      1. [[1, 0],
          [0, 1],
          [1, 1]]  
        
      2. [[1, 1],
          [1, 1],
          [0, 0]]
        
    ✔️3. [[0.5, 0],
          [0, 1],
          [0.5, 0]]
        
      4. [[0.5, 0.5],
          [0, 0.5],
          [0.5, 0]]
        
      5. [[0, 1],
          [1, 0],
          [0, 1]]