機器學習緒論

太陽是白的發表於2023-02-02

機器學習緒論

機器學習概念
機器學習
  • 有監督學習
    • 如:迴歸,分類
  • 無監督學習
    • 如:聚類,降維
什麼是機器學習
  • 程式透過不斷的學習達到一定的效能,可以完成指定的任務

  • 定義

    • (1)機器學習是一門人工智慧的科學,該領域的主要研究物件是人工智慧,特別是如何在經驗 學習中改善具體演算法的效能。

      (2)機器學習是對能透過經驗自動改進的計算機演算法的研究。

      (3)機器學習是用資料或以往的經驗,以此最佳化計算機程式的效能標準

  • 機器學習的三個要素

    • 模型(model):模型在未進行訓練前,其可能的引數是多個甚至無窮的,故可能的模型也是多個甚至無窮的,這些模型構成的集合就是假設空間。
    • 策略(strategy):即從假設空間中挑選出引數最優的模型的準則。模型的分類或預測結果與實際情況的誤差(損失函式)越小,模型就越好。那麼策略就是誤差最小。
    • 演算法(algorithm):即從假設空間中挑選模型的方法(等同於求解最佳的模型引數)。機器學習的引數求解通常都會轉化為最最佳化問題,故學習演算法通常是最最佳化演算法,例如最速梯度下降法、牛頓法以及擬牛頓法等
機器學習演算法
  • 監督學習 :房價預測 ( 迴歸 )
    • 監督學習
      • 正確價格
    • 迴歸問題
      • 預測價格
  • 監督學習 :垃圾郵件分類 ( 分類 )
    • 監督學習
      • \(y\in\lbrace 0,1\rbrace\) 0表示負向類 1表示正向類
    • 分類問題
      • 對郵件的好壞進行區分
  • 無監督學習 **:聚類 **
    • 如:郵件分類 沒有指定哪些是正向類,哪些是負向類,無監督學習可以將它們分為不同的簇,這就是聚類
    • 如新聞分類,同一個新聞主題的多個報導網頁都放到同一個簇別中一起展示,這就是聚類演算法的應用
  • 總結
    • 監督學習:所用訓練資料都是被標記過的
    • 無監督學習:訓練集中的所有資料都沒有標記
補充
矩陣

​ 由 m × n 個數\(A_ij\)排成的m行n列的數表稱為m行n列的矩陣,簡稱m × n矩陣。記作:

\[A = \left[ \begin{array} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ a_{31} & a_{32} & \cdots & a_{3n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \\ \end{array} \right] \]

​ 這種 \(m\times n\) 個數稱為矩陣 \(A\) 的元素 \(A_{ij} = i,j\) 代表 \(i 行,j列\)

向量

´ 向量:在數學中,向量(也稱為歐幾里得向量、幾何向量、向量),指具有大小和方向的量。與向量對應的只有大小,沒有方向的量叫做數量(物理學中稱標量

是一行或一列的特殊矩形,通常情況下,向量指列向量

​ 向量:一個 \(n\times 1\) 矩陣

\[Y = \left[ \begin{array}\\ {11} \\ {21} \\ {31} \\ 40 \\ \end{array} \right] \]

矩陣運算
  • 舉例

\[A =\left[ \begin{array}\\ a1 & a2 \\ a3 & a4 \\ \end{array} \right] B = \left[ \begin{array}\\ b1 & b2 \\ b3& b4 \\ \end{array} \right] \]

  • 矩陣加法,減法

    • 滿足交換律 : A+B = B+A , A - B = B - A

      \[A+B =\left[ \begin{array}\\ a1 + b1 & a2+b2 \\ a3+b3&a4+b4 \\ \end{array} \right] \]

      減法相同
  • 矩陣乘法

    • 乘法條件:兩個矩陣相乘,需要滿足A的列數等於**B的行數*

    • A矩陣的行元素 ,乘以 B 的每一列然後相加

      \[A * B =\left[ \begin{array}\\ a1*b1+a2*b3&a1*b2+a2*b4\\ a3*b1+a4*b3&a3*b2+a4*b4 \end{array} \right] \]

    • 乘法不滿足交換律,但滿足分配率和結合率

      • AB \(\neq\) BA
      • (AB)C=A(BC)
      • (A+B)C=AC+BC
      • C(A+B)=CA+CB
  • 逆矩陣

    • **逆矩陣 ** : 如果 A 是一個m x m 矩陣, 並且如果它有逆矩陣。

      矩陣與其逆陣的乘積等於單位陣:

      $AA^{-1} = A^{-1}A = I $

    • 不是所有的矩陣都有逆矩陣

      沒有逆矩陣的矩陣稱為“奇異矩陣” 或“退化矩陣”。

  • 矩陣轉置

    • 例如:

      \[A =\left[ \begin{array}\\ 1 & 2 &3\\ 4 & 5 &6\\ \end{array} \right] A^T =\left[ \begin{array}\\ 1 &4\\ 2&5\\ 3&6\\ \end{array} \right] \]

  • 線性方程

    \[\begin{cases} a_{11}x_1+a_{12}x_2+a_{13}x_3=y1 \\ a_{21}x_1+a_{22}x_2+a_{23}x_3=y2 \\ a_{31}x_1+a_{32}x_2+a_{33}x_3=y3 \\ \end{cases} \]

    \[若y = \left[ \begin{array}\\ y1\\ y2\\ y3 \end{array} \right] , A = \left[ \begin{array}\\ a_{11} &a_{12}&a_{13}\\ a_{21}&a_{22}&a_{32}\\ a_{31}&a_{32}&a_{33}\\ \end{array} \right] , x = \left[ \begin{array}\\ x_1\\ x_2\\ x_3\\ \end{array} \right] 所以 \left[ \begin{array}\\ y1\\ y2\\ y3 \end{array} \right] = \left[ \begin{array}\\ a_{11} &a_{12}&a_{13}\\ a_{21}&a_{22}&a_{32}\\ a_{31}&a_{32}&a_{33}\\ \end{array} \right] \left[ \begin{array}\\ x_1\\ x_2\\ x_3\\ \end{array} \right] \]

  • 線性組合

    • 程式碼實現轉置

      y = w.T.dot(x)
      

\[y = \sum w_ix_i = w_1x_1 + w_2x_2+...w_nx_n \]

\[= \left[ \begin{array}\\ w_1w_2 ...w_n \end{array} \right] \left[ \begin{array}\\ x_1\\ x_2\\ \vdots x_n \end{array} \right] =w^Tx \]

\[= \left[ \begin{array}\\ x_1x_2 ...x_n \end{array} \right] \left[ \begin{array}\\ w_1\\ w_2\\ \vdots w_n \end{array} \right] =x^Tw \]

  • np.array 的使用

    from numpy import *
    import numpy as np
    
    # 使用np.array建立矩陣:
    np.array([[1,4],[3,5]])
    
    # 使用mat建立矩陣:   
    mat(‘[1 2;3 4]’)   # 用;隔開,用‘ ’括上;也可以mat([1,2],[3,4])
    
    # 建立3*3的零矩陣:
    np.zeros((3,3))  
    
    # 建立2*4的1矩陣 :
    np.ones((2,4))   #預設是浮點型的資料  
    
    # 建立2*2的單位矩陣:
    np.eye(2,2,dtype=int) #注意沒有多餘的()
    
    # 建立對角矩陣:
    np.diag([1, 2, 3])
    
    # 建立有序矩陣:
    np.arange(2,12,2)
    
    np.sum(): 按列或行求和,A.sum(axis=0); sum(A,1); sum(A[2:5], 0)
    np.max(): 按列或行求最大值,A.max(axis=0); A.max(1); max(A[2:5],0)
    np.min(): 按列或行求最小值,A.min(0); A.min(1); min(A[2:5],1)
    np.argmax(): 列或行最大值的索引,A.argmax(axis=0); argmax(A[2:5],1)  
    np.argmin(): 列或行求最大值的索引,A.argmin(0); argmin(A[2:5],0)
    
    (引數
    axis=0, 按列
    axis=1,按行
    )
    
  • slice切片

    A[ 起始位:終止位:步長 ]      
    
    1.每個元素可用正向下標(從0開始)或反向下標(從-1開始)表示,
    2.步長預設=1,可省略
    
    A=np.array([1,2,3,4,5,6]):    正向下標:0 ~ 5    反向下標:-1~-6
    # A[1:5]->[2,3,4,5]   (正向,預設步長=1)
    # A[2:] ->[3,4,5,6]     (正向,預設步長=1)
    # A[:5] ->[1,2,3,4,5]  (正向,預設步長=1)
    # A[::2]->[1,3,5]   (正向,步長=2)
    # A[1:5:2]->[2,4]   (正向,步長=2)
    # A[-1:-4:-1]->[6,5,4]  (反向,步長=-1)
    # A[-1::-1]->[6,5,4,3,2,1]  (反向,步長=-1)
    # A[-2:-5:-2]->[5,3]  (反向,步長=-2)
    # A[1:-2]->[2,3,4]  (正向,預設步長=1)
    # A[-1:2:-1]->[6,5,4]  (反向,步長=-1)
    
  • vstack , hstack 的使用

    from numpy import *
    import numpy as np
    
    # 建立2行2列的全1矩陣
    a=np.ones((2,2))
    
    # 建立2行2列的全零矩陣
    b=np.eye(2,2)
    
    # 按列方向合併兩個矩陣,列數不變,行數相加
    vstack((a,b))
    
    [[1, 1]
    [1, 1]
    [1, 0]
    [0, 1]]
    
    # 按行方向合併兩個矩陣, 行數不變,列數相加
    hstack((a,b))
    
    [[1, 1, 1, 0]
    [1, 1, 0, 1]]
    
  • **np.c_ ** np.r _ 的使用

    from numpy import *
    import numpy as np
    # np.c_ : 按列連線兩個矩陣
    # np.r_: 按行連線兩個矩陣
    
    1.
    a = np.array([1, 2, 3]);  b = np.array([4, 5, 6])
    
    c = np.c_[a,b] ->[[1, 4 ], [2, 5], [3 6]]
    c = np.c_[c,a] -> [[1, 4, 1], [2, 5, 2], [3, 6, 3]]
    c = np.r_[a,b] -> [1, 2, 3, 4, 5, 6]
    
    2.
    a = np.array([[1, 2, 3],[1,1,1]]);    b = np.array([[4, 5, 6],[7,8,9]])
    c =np.c_[a,b]->[[1, 2, 3, 4, 5, 6], [1, 1, 1, 7, 8, 9]]
    c = np.r_[a,b] -> [[1, 2, 3], [1, 1, 1], [4, 5, 6], [7, 8, 9]]
    
    
    
  • 畫圖 matplotlib

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    
    matplotlib.rcParams["font.sans-serif"] = ["SimHei"]  #在畫布中顯示中文
    matplotlib.rcParams['axes.unicode_minus']=False      #畫布中顯示負號 
    
    x=[1.5,0.8,2.6,1.0,0.6,2.8,1.2,0.9,0.4,1.3,1.2,2.0,1.6,1.8,2.2]
    y=[3.1,1.9,4.2,2.3,1.6,4.9,2.8,2.1,1.4,2.4,2.4,3.8,3.0,3.4,4.0]
    
    #建立畫布
    plt.figure("散點圖")
    #畫圖
    plt.scatter(x,y)
    
    #線性迴歸公式
    w = 1.5
    b = 0.8
    
    x_min=min(x)
    x_max=max(x)
    
    y_min = w*x_min + b
    y_max = w*x_max + b
    
    #畫出迴歸方程
    plt.plot([x_min,x_max],[y_min,y_max],'r')
    plt.show()
    
總結
  • 透過上圖我們可以知道,不斷的更換 w 和 b 可以讓直線擬合散點圖
  • 所以 在機器學習中線性迴歸模型,就是在不斷的更新 w 和 b 找到 w 和 b 的最優解

相關文章