吳恩達:機器學習的六個核心算法!

人工智能領域的權威吳恩達教授,在其創立的《The Batch》週報中發表了一篇博文,概述了機器學習領域六種基礎算法的歷史和重要性。他強調了在這一領域不斷學習和更新知識的必要性。

這些算法包括線性迴歸、邏輯迴歸、梯度下降、神經網絡、決策樹和 k 均值聚類算法,它們是機器學習進步的基石。本文將進一步探討這些算法的背景、原理、優缺點及應用場景。

  1. 線性迴歸 =======

背景

線性迴歸是最古老也是最簡單的迴歸算法之一,其歷史可以追溯到 18 世紀,由卡爾 · 弗里德里希 · 高斯(Carl Friedrich Gauss)提出。最初的應用主要集中在天文學和物理學中,用於預測軌跡和其他連續變量。這種方法在統計學中佔據了重要地位,成爲許多複雜算法的基礎。隨着計算技術的進步,線性迴歸逐漸在經濟學、工程學和社會科學等領域得到廣泛應用。

原理

線性迴歸通過尋找數據點之間的最佳擬合直線,來預測目標變量。其數學模型爲:

其中,(y) 是目標變量,( x ) 是特徵變量,( \beta_0 ) 和 ( \beta_1 ) 分別爲截距和斜率,( \epsilon ) 是誤差項。我們通過最小化均方誤差(Mean Squared Error, MSE)來估計這些參數:

步驟

  1. 數據準備:收集和準備數據,包括數據清洗和特徵選擇。

  2. 模型訓練:使用訓練數據擬合線性迴歸模型,通過最小二乘法估計參數 (\beta_0) 和 ( \beta_1 )。

  3. 模型評估:使用測試數據評估模型性能,常用評估指標包括 (R^2) 值和均方誤差。

  4. 預測:使用訓練好的模型進行預測。

優缺點

優點

缺點

(圖:對異常值敏感)

應用場景

線性迴歸在經濟學、金融學、社會學等領域有廣泛應用。以下是一些具體的應用場景:

  1. 經濟學:線性迴歸用於預測消費支出和收入之間的關係。例如,經濟學家可以通過分析歷史數據,建立模型來預測未來的消費趨勢。

  2. 金融學:線性迴歸用於股票價格預測和風險管理。例如,金融分析師可以使用歷史股票價格數據,建立模型來預測未來的價格走勢。

  3. 社會學:線性迴歸用於研究社會現象之間的關係。例如,社會學家可以分析教育水平和收入之間的關係,發現教育對收入的影響。

案例分析

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 設置matplotlib支持中文顯示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 設置中文顯示
plt.rcParams['axes.unicode_minus'] = False # 正確顯示負號

# 創建武俠世界中的功力(X)與成名年數(y)的數據
X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1) # 功力等級
y = np.array([2, 3, 3.5, 5, 6, 7.5, 8, 9, 10.5, 11]) # 成名年數

# 使用線性迴歸模型
model = LinearRegression()
model.fit(X, y) # 訓練模型

# 預測功力等級對應的成名年數
X_predict = np.array([11, 12, 13]).reshape(-1, 1) # 新的功力等級
y_predict = model.predict(X_predict) # 進行預測

# 繪製功力與成名年數的關係
plt.scatter(X, y, color='red', label='實際成名年數') # 原始數據點
plt.plot(X, model.predict(X), color='blue', label='功力成名模型') # 擬合的直線
plt.scatter(X_predict, y_predict, color='green', label='預測成名年數') # 預測點
plt.xlabel('功力等級')
plt.ylabel('成名年數')
plt.title('武俠世界的功力與成名年數關係')
plt.legend()
plt.show()

我們首先創建了一組簡單的數據,模擬武俠世界中的人物功力等級與他們成名所需年數之間的關係。

然後,我們使用了線性迴歸模型來擬合這些數據,並對新的功力等級進行了成名年數的預測。

最後,通過繪圖展示了功力等級與成名年數之間的線性關係,以及模型的預測效果。

  1. 邏輯迴歸 =======

背景

邏輯迴歸(Logistic Regression)最早由英國統計學家 David Cox 於 1958 年提出,儘管其名稱中包含 “迴歸” 二字,但它實際上是一種分類算法,主要用於解決二分類問題。隨着計算能力的提升和數據量的增加,邏輯迴歸在醫學、金融、社會科學等領域得到了廣泛應用,成爲統計學習和機器學習的重要工具之一。

原理

邏輯迴歸通過一個邏輯函數(logistic function)將線性迴歸的輸出映射到一個 (0, 1) 區間,從而進行二分類。其數學模型爲:

其中,(P) 是事件發生的概率,( x ) 是特徵變量,( \beta_0 ) 和 ( \beta_1 ) 分別爲截距和係數。最終,通過最大似然估計法(Maximum Likelihood Estimation, MLE)來估計這些參數。

特別的,Sigmoid 函數

Sigmoid 函數:邏輯迴歸中使用的 Sigmoid 函數 能將任意實數值映射到 (0, 1) 區間,便於解釋爲概率。

一圖勝千言:

具體步驟包括:

  1. 初始化參數:隨機初始化參數 (\beta_0) 和 ( \beta_1 )。

  2. 計算預測值:根據當前參數計算每個樣本的預測概率 (\hat{P} )。

  3. 計算損失函數:損失函數通常採用對數似然函數(Log-Likelihood Function):

  1. 優化參數:通過梯度下降法或其他優化算法,最大化對數似然函數,更新參數。

優缺點

優點

缺點

應用場景

邏輯迴歸在醫學診斷、市場營銷、信用評分等領域有廣泛應用。以下是一些具體的應用場景:

  1. 醫學診斷:邏輯迴歸用於預測患者是否患有某種疾病。例如,通過患者的各項檢查指標,建立模型預測某種疾病的發生概率。

  2. 市場營銷:邏輯迴歸用於預測用戶是否會購買某產品。例如,通過用戶的瀏覽行爲、歷史購買記錄等,預測用戶的購買意圖。

  3. 信用評分:邏輯迴歸用於評估借款人的違約風險。例如,通過借款人的收入、信用記錄等信息,預測其是否會違約。

案例分析

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
import matplotlib.pyplot as plt
import numpy as np

# 生成模擬的武俠世界功力和內功心法數據集
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42)

# 創建邏輯迴歸模型對象
lr = LogisticRegression()

# 訓練模型
lr.fit(X, y)

# 定義決策邊界繪製函數
def plot_decision_boundary(X, y, model):
    # 設置最小和最大值,以及增量
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
                         np.arange(y_min, y_max, 0.1))

    # 預測整個網格的值
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    # 繪製決策邊界和散點圖
    plt.contourf(xx, yy, Z, alpha=0.4)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor='k')
    plt.xlabel('功力')
    plt.ylabel('內功心法')
    plt.title('武俠世界中的高手分類圖')

# 繪製決策邊界和數據點
plot_decision_boundary(X, y, lr)
plt.show()

我們首先使用 make_classification 函數生成了一組模擬的二維數據,模擬武俠世界中的人物根據其功力和內功心法被分爲兩類:普通武者和高手。

然後,我們訓練了一個邏輯迴歸模型並繪製了決策邊界,以及不同類別的樣本點,直觀展示了模型的分類效果。

在圖形中,我們可以看到如何根據功力和內功心法來區分不同的武俠人物。

  1. 梯度下降 =======

背景

梯度下降法(Gradient Descent)由法國數學家 Augustin-Louis Cauchy 在 1847 年提出,是一種用於尋找函數最小值(或最大值)的迭代優化算法。梯度下降在機器學習中尤爲重要,因爲它是許多算法(如線性迴歸、邏輯迴歸和神經網絡)中用於參數優化的核心方法。

原理

梯度下降的基本思想是從一個初始點開始,沿着函數的負梯度方向迭代更新參數,以最小化損失函數。梯度是函數在該點的偏導數向量,表示函數在該點的變化方向。梯度下降的更新公式爲:

具體步驟包括:

  1. 初始化參數:隨機初始化參數 (\theta)。

  2. 計算梯度:計算損失函數在當前參數下的梯度。

  3. 更新參數:根據梯度更新參數。

  4. 迭代:重複步驟 2 和 3,直到損失函數收斂或達到最大迭代次數。

類型

梯度下降有幾種常見的變種:

  1. 批量梯度下降(Batch Gradient Descent):使用整個數據集計算梯度,每次迭代更新參數。適用於小數據集。

  2. 隨機梯度下降(Stochastic Gradient Descent, SGD):每次迭代僅使用一個樣本計算梯度,更新參數。適用於大數據集,但收斂較慢且波動較大。

  3. 小批量梯度下降(Mini-batch Gradient Descent):每次迭代使用一個小批量樣本計算梯度,更新參數。結合了批量梯度下降和隨機梯度下降的優點。

優缺點

優點

缺點

應用場景

梯度下降廣泛應用於各種機器學習模型的訓練過程中。以下是一些具體的應用場景:

  1. 線性迴歸:在線性迴歸模型中,梯度下降用於優化模型參數,使得預測誤差最小化。

  2. 邏輯迴歸:在邏輯迴歸模型中,梯度下降用於最大化對數似然函數,優化分類模型。

  3. 神經網絡:在神經網絡中,梯度下降(特別是反向傳播算法)用於調整網絡的權重,以最小化預測誤差。

案例分析

import numpy as np
import matplotlib.pyplot as plt

# 示例數據
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
y = np.dot(X, np.array([1, 2])) + 3

# 初始化參數,考慮偏置項
theta = np.random.randn(3, 1)
iterations = 1000
alpha = 0.01

# 損失函數
def compute_cost(X, y, theta):
    m = len(y)
    predictions = X.dot(theta)
    cost = (1 / 2 * m) * np.sum(np.square(predictions - y))
    return cost

# 梯度下降
def gradient_descent(X, y, theta, alpha, iterations):
    m = len(y)
    cost_history = np.zeros(iterations)

    for i in range(iterations):
        gradients = X.T.dot(X.dot(theta) - y) / m
        theta = theta - alpha * gradients
        cost_history[i] = compute_cost(X, y, theta)

    return theta, cost_history

# 添加偏置項
X_b = np.c_[np.ones((len(X), 1)), X]

# 運行梯度下降
theta, cost_history = gradient_descent(X_b, y, theta, alpha, iterations)

# 結果可視化
plt.plot(range(1, iterations + 1), cost_history, 'b-')
plt.xlabel('迭代次數')
plt.ylabel('損失值')
plt.title('梯度下降優化損失值')
plt.show()

print(f"優化後的參數: {theta.ravel()}")
  1. 決策樹 ======

背景

決策樹(Decision Tree)是一種基於樹形結構的監督學習算法,用於分類和迴歸任務。決策樹算法最早由 Ross Quinlan 在 20 世紀 80 年代提出,包括經典的 ID3、C4.5 和 CART 算法。決策樹的直觀和易於解釋的特點,使其在金融、醫療和市場營銷等領域得到了廣泛應用。

原理

決策樹通過遞歸地將數據集分割成更小的子集來構建樹狀模型。每個內部節點代表一個特徵,每個分支代表該特徵的一個取值,每個葉節點代表一個類別或預測值。決策樹的構建過程包括以下步驟:

  1. 選擇最優特徵:根據某種指標(如信息增益、基尼係數)選擇最優特徵進行分割。

  2. 分割數據集:根據選擇的特徵將數據集分割成子集。

  3. 遞歸構建子樹:對子集遞歸調用上述步驟,直到滿足停止條件(如所有數據點屬於同一類別或達到最大深度)。

信息增益:信息增益用於衡量某一特徵對數據集進行分割時所帶來的信息熵的減少。信息熵(Entropy)表示數據集的純度,計算公式爲:

基尼係數:基尼係數(Gini Index)用於衡量數據集的不純度,計算公式爲:

優缺點

優點

缺點

應用場景

決策樹在金融、醫療、市場營銷等領域有廣泛應用。以下是一些具體的應用場景:

  1. 信用評分:決策樹用於評估借款人的違約風險。例如,通過借款人的收入、信用記錄等信息,預測其是否會違約。

  2. 疾病診斷:決策樹用於預測患者是否患有某種疾病。例如,通過患者的病史、體檢數據等信息,預測其是否患有某種疾病。

  3. 客戶分類:決策樹用於市場營銷中的客戶細分。例如,根據客戶的購買行爲、人口統計數據等,分類客戶羣體。

案例分析

讓我們來看一個具體的案例:使用決策樹進行客戶分類。假設我們有一個數據集,其中包含客戶的年齡、收入和購買情況(0 表示未購買,1 表示購買)。我們可以使用決策樹來建立客戶特徵與購買情況之間的關係模型。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import numpy as np

# 生成武俠風格的數據,確保所有特徵值爲正數
X, y = make_classification(n_samples=200, n_features=2, n_redundant=0, n_informative=2,
                           n_clusters_per_class=1, random_state=42)
X += np.abs(X.min())  # 平移數據確保爲正

# 將數據集分爲訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 創建決策樹模型,並設置最大深度爲3
dt = DecisionTreeClassifier(max_depth=3)

# 訓練模型
dt.fit(X_train, y_train)

# 繪製數據點和決策邊界
def plot_decision_boundary(model, X, y):
    # 設置最小和最大值,以及增量
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01),
                         np.arange(y_min, y_max, 0.01))

    # 預測整個網格的值
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    # 繪製決策邊界
    plt.contourf(xx, yy, Z, alpha=0.4)
    # 繪製不同類別的樣本點
    plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], c='red', marker='x', label='普通武者')
    plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], c='blue', marker='o', label='武林高手')
    plt.xlabel('功力值')
    plt.ylabel('內功心法')
    plt.title('武俠世界中的武者分類圖')
    plt.legend()

# 繪製決策邊界和數據點
plot_decision_boundary(dt, X, y)
plt.show()

這段代碼首先生成了一組包含 200 個樣本的武俠風格數據,每個樣本有兩個特徵:功力值和內功心法,目標是分類武者是否爲武林高手。

然後,我們使用 DecisionTreeClassifier 創建了一個決策樹模型並對其進行訓練。

通過定義 plot_decision_boundary 函數,我們繪製了模型的決策邊界,並使用不同顏色和形狀標記來區分普通武者和武林高手,直觀地展示了決策樹在二分類任務中的分類效果。

(你可以修改 max_depth 看看有什麼變化)

  1. 神經網絡 =======

背景

神經網絡(Neural Networks)起源於 20 世紀 40 年代,由 Warren McCulloch 和 Walter Pitts 提出。他們的工作靈感來源於人腦的結構和功能,希望通過數學模型模擬生物神經元的工作方式。神經網絡的發展經歷了多次起伏,直到 2006 年 Geoffrey Hinton 等人提出深度學習(Deep Learning)的概念,神經網絡才重新獲得關注,並迅速成爲人工智能領域的熱點。

原理

神經網絡由多個層級的節點(神經元)組成,每個節點通過加權連接傳遞信號。一個典型的神經網絡結構包括輸入層、隱藏層和輸出層。輸入層接收原始數據,隱藏層通過加權求和和激活函數處理數據,輸出層生成最終的預測結果。每層節點的輸出由前一層節點的加權和通過激活函數計算得到:

其中,(a) 是輸出,( W ) 是權重矩陣,( x ) 是輸入向量,( b ) 是偏置向量,( f ) 是激活函數。

激活函數

訓練: 神經網絡通過反向傳播算法(Backpropagation)進行訓練。反向傳播通過計算損失函數的梯度,調整網絡中的權重和偏置,以最小化預測誤差。訓練過程包括以下步驟:

  1. 正向傳播:計算每層的輸出,直到生成最終預測結果。

  2. 計算損失:使用損失函數(如均方誤差、交叉熵)計算預測結果與真實值之間的誤差。

  3. 反向傳播:計算損失函數對每個權重和偏置的梯度。

  4. 參數更新:使用梯度下降或其他優化算法更新權重和偏置。

優缺點

優點

缺點

應用場景

神經網絡在圖像識別、語音識別、自然語言處理等領域有廣泛應用。以下是一些具體的應用場景:

  1. 圖像識別:神經網絡用於分類和識別圖像中的物體。例如,卷積神經網絡(CNN)在圖像分類任務中表現出色。

  2. 語音識別:神經網絡用於將語音信號轉換爲文本。例如,循環神經網絡(RNN)和長短期記憶網絡(LSTM)在語音識別任務中有廣泛應用。

  3. 自然語言處理:神經網絡用於文本分類、機器翻譯、文本生成等任務。例如,基於注意力機制的 Transformer 模型在機器翻譯中取得了顯著進展。

案例分析

讓我們來看一個具體的案例:使用神經網絡進行手寫數字識別。假設我們使用經典的 MNIST 數據集,其中包含 28x28 像素的手寫數字圖片,每張圖片對應一個數字標籤(0-9)。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.utils import to_categorical

# 加載數據
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 預處理數據
X_train = X_train.reshape(-1, 28 * 28) / 255.0
X_test = X_test.reshape(-1, 28 * 28) / 255.0
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 創建模型
model = Sequential([
    Flatten(input_shape=(28 * 28,)),
    Dense(128, activation='relu'),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])

# 編譯模型
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 訓練模型
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_split=0.2)

# 評估模型
loss, accuracy = model.evaluate(X_test, y_test)
print(f"Test Accuracy: {accuracy:.4f}")

在這個例子中,我們使用 TensorFlow 和 Keras 庫創建了一個簡單的全連接神經網絡,用於識別手寫數字。通過訓練模型,我們可以在測試數據上評估其準確性,並可視化模型的性能。

  1. K 均值聚類 =========

背景

K 均值聚類(K-means Clustering)是一種常用的無監督學習算法,用於將數據集劃分爲 K 個互斥的簇。該算法由 Stuart Lloyd 於 1957 年在電話信號處理研究中首次提出,1967 年由 James MacQueen 正式命名並推廣應用。K 均值聚類在許多領域得到廣泛應用,如圖像處理、市場營銷、模式識別等。

原理

K 均值聚類通過迭代優化的方法,將數據點分配到 K 個簇中,使得每個簇內的數據點與簇中心(質心)之間的距離平方和最小化。具體步驟包括:

  1. 初始化中心點:隨機選擇 K 個初始中心點(質心)。

  2. 分配數據點:將每個數據點分配到最近的中心點所屬的簇中。

  3. 更新中心點:重新計算每個簇的中心點,即簇內所有數據點的均值。

  4. 迭代:重複步驟 2 和 3,直到中心點不再發生變化或達到最大迭代次數。

算法的目標是最小化以下目標函數:

優缺點

優點

缺點

比如下圖數據分佈,使用 K-means 的效果就很憂傷了

應用場景

K 均值聚類在市場營銷、圖像處理、模式識別等領域有廣泛應用。以下是一些具體的應用場景:

  1. 客戶分類:K 均值聚類用於市場營銷中的客戶細分。例如,根據客戶的購買行爲、人口統計數據等,將客戶分爲不同的羣體,以便制定針對性的營銷策略。

  2. 圖像壓縮:K 均值聚類用於圖像處理中的圖像壓縮。例如,通過聚類像素顏色,將圖像中的顏色數減少,從而實現圖像壓縮。

  3. 模式識別:K 均值聚類用於模式識別中的特徵提取。例如,在手寫數字識別中,通過聚類手寫數字的特徵,將相似的數字聚類在一起,便於後續分類。

案例分析

讓我們來看一個具體的案例:使用 K 均值聚類進行客戶分類。假設我們有一個數據集,其中包含客戶的年齡和收入。我們可以使用 K 均值聚類將客戶分爲三個羣體。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 示例數據
data = {
    'age': [25, 45, 35, 50, 23, 31, 22, 35, 42, 51],
    'income': [50000, 100000, 75000, 120000, 40000, 60000, 45000, 80000, 110000, 130000]
}
df = pd.DataFrame(data)

# 創建K均值模型
kmeans = KMeans(n_clusters=3)
kmeans.fit(df)

# 預測聚類結果
df['cluster'] = kmeans.labels_

# 可視化聚類結果
plt.scatter(df['age'], df['income'], c=df['cluster'], cmap='viridis')
plt.xlabel('Age')
plt.ylabel('Income')
plt.title('Customer Segments')
plt.show()

print(df)

在這個例子中,我們使用 sklearn 庫中的 KMeans 模型來對客戶的年齡和收入進行聚類。通過訓練模型,我們可以將客戶分爲三個羣體,並可視化聚類結果。同時,可以輸出每個客戶的聚類標籤。

 [抱個拳,總個結] 

線性迴歸,一種簡單而有效的迴歸算法,

邏輯迴歸,一種簡單而有效的分類算法,

梯度下降,一種基本且重要的優化算法,

決策樹,一種直觀且易於解釋的機器學習模型,

神經網絡,一種強大的深度學習模型,

K 均值聚類,一種簡單高效的無監督學習算法,

這些基礎算法構成了機器學習的核心,無論是線性迴歸的簡潔性,還是神經網絡的複雜性,都展示了它們在不同應用場景中的價值。同時,這些算法正被不斷改進和創新,Enjoy

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/o_PPJESRFLfIxHz3UsSfpw