用Python實現機器學習算法——Softmax 回歸算法

2021-02-20 圖靈人工智慧

Anna-Lena Popkes,德國波恩大學計算機科學專業的研究生,主要關注機器學習和神經網絡。

編譯 | 林椿眄

出品 | 人工智慧頭條 

導讀:Python 被稱為是最接近 AI 的語言。最近一位名叫Anna-Lena Popkes的小姐姐在GitHub上分享了自己如何使用Python(3.6及以上版本)實現7種機器學習算法的筆記,並附有完整代碼。所有這些算法的實現都沒有使用其他機器學習庫。這份筆記可以幫大家對算法以及其底層結構有個基本的了解,但並不是提供最有效的實現。

Softmax 回歸算法,又稱為多項式或多類別的 Logistic 回歸算法。

給定:

數據集

Softmax 回歸模型有以下幾個特點:

訓練 Softmax 回歸模型有不同步驟。首先(在步驟0中),模型的參數將被初始化。在達到指定訓練次數或參數收斂前,重複以下其他步驟。

第 0 步:用 0 (或小的隨機值)來初始化權重向量和偏置值

第 1 步:對於每個類別k,計算其輸入的特徵與權重值的線性組合,也就是說為每個類別的訓練樣本計算一個得分值。對於類別k,輸入向量為,則得分值的計算如下:

其中表示類別k的權重矩陣·表示點積。

我們可以通過矢量化和矢量傳播法則計算所有類別及其訓練樣本的得分值:


其中 X 是所有訓練樣本的維度矩陣,W 表示每個類別的權重矩陣維度,其形式為

第 2 步:用 softmax 函數作為激活函數,將得分值轉化為概率值形式。屬於類別 k 的輸入向量的概率值為: 

同樣地,我們可以通過矢量化來對所有類別同時處理,得到其概率輸出。模型預測出的表示的是該類別的最高概率。

第 3 步:計算整個訓練集的損失值。

我們希望模型預測出的高概率值是目標類別,而低概率值表示其他類別。這可以通過以下的交叉熵損失函數來實現:

在上面公式中,目標類別標籤表示成獨熱編碼形式( one-hot )。因此為1時表示的目標類別是 k,反之則為 0。

第 4 步:對權重向量和偏置量,計算其對損失函數的梯度。

關於這個導數實現的詳細解釋,可以參見這裡(http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/)。

一般形式如下:

對於偏置量的導數計算,此時為1。


第 5 步:對每個類別k,更新其權重和偏置值。

其中,表示學習率。

In [1]:

from sklearn.datasets import load_iris
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
np.random.seed(13)

數據集


In [2]:

X, y_true = make_blobs(centers=4, n_samples = 5000)
fig = plt.figure(figsize=(8,6))
plt.scatter(X[:,0], X[:,1], c=y_true)
plt.title("Dataset")
plt.xlabel("First feature")
plt.ylabel("Second feature")
plt.show()

In [3]:

# reshape targets to get column vector with shape (n_samples, 1)
y_true = y_true[:, np.newaxis]
# Split the data into a training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y_true)
print(f'Shape X_train: {X_train.shape}')
print(f'Shape y_train: {y_train.shape}')
print(f'Shape X_test: {X_test.shape}')
print(f'Shape y_test: {y_test.shape}')

Shape X_train: (3750, 2)

Shape y_train: (3750, 1)

Shape X_test: (1250, 2)

Shape y_test: (1250, 1)

Softmax回歸分類


class SoftmaxRegressor:
   def __init__(self):
       pass
   def train(self, X, y_true, n_classes, n_iters=10, learning_rate=0.1):
       """
       Trains a multinomial logistic regression model on given set of training data
       """
       self.n_samples, n_features = X.shape
       self.n_classes = n_classes
       self.weights = np.random.rand(self.n_classes, n_features)
       self.bias = np.zeros((1, self.n_classes))
       all_losses = []
       for i in range(n_iters):
           scores = self.compute_scores(X)
           probs = self.softmax(scores)
           y_predict = np.argmax(probs, axis=1)[:, np.newaxis]
           y_one_hot = self.one_hot(y_true)
           loss = self.cross_entropy(y_one_hot, probs)
           all_losses.append(loss)
           dw = (1 / self.n_samples) * np.dot(X.T, (probs - y_one_hot))
           db = (1 / self.n_samples) * np.sum(probs - y_one_hot, axis=0)
           self.weights = self.weights - learning_rate * dw.T
           self.bias = self.bias - learning_rate * db
           if i % 100 == 0:
               print(f'Iteration number: {i}, loss: {np.round(loss, 4)}')
       return self.weights, self.bias, all_losses
   def predict(self, X):
       """
       Predict class labels for samples in X.
       Args:
           X: numpy array of shape (n_samples, n_features)
       Returns:
           numpy array of shape (n_samples, 1) with predicted classes
       """
       scores = self.compute_scores(X)
       probs = self.softmax(scores)
       return np.argmax(probs, axis=1)[:, np.newaxis]
   def softmax(self, scores):
       """
       Tranforms matrix of predicted scores to matrix of probabilities
       Args:
           scores: numpy array of shape (n_samples, n_classes)
           with unnormalized scores
       Returns:
           softmax: numpy array of shape (n_samples, n_classes)
           with probabilities
       """
       exp = np.exp(scores)
       sum_exp = np.sum(np.exp(scores), axis=1, keepdims=True)
       softmax = exp / sum_exp
       return softmax
   def compute_scores(self, X):
       """
       Computes class-scores for samples in X
       Args:
           X: numpy array of shape (n_samples, n_features)
       Returns:
           scores: numpy array of shape (n_samples, n_classes)
       """
       return np.dot(X, self.weights.T) + self.bias
   def cross_entropy(self, y_true, scores):
       loss = - (1 / self.n_samples) * np.sum(y_true * np.log(scores))
       return loss
   def one_hot(self, y):
       """
       Tranforms vector y of labels to one-hot encoded matrix
       """
       one_hot = np.zeros((self.n_samples, self.n_classes))
       one_hot[np.arange(self.n_samples), y.T] = 1
       return one_hot


初始化並訓練模型


regressor = SoftmaxRegressor()
w_trained, b_trained, loss = regressor.train(X_train, y_train, learning_rate=0.1, n_iters=800, n_classes=4)
fig = plt.figure(figsize=(8,6))
plt.plot(np.arange(800), loss)
plt.title("Development of loss during training")
plt.xlabel("Number of iterations")
plt.ylabel("Loss")
plt.show()Iteration number: 0, loss: 1.393

Iteration number: 100, loss: 0.2051

Iteration number: 200, loss: 0.1605

Iteration number: 300, loss: 0.1371

Iteration number: 400, loss: 0.121

Iteration number: 500, loss: 0.1087

Iteration number: 600, loss: 0.0989

Iteration number: 700, loss: 0.0909

測試模型


n_test_samples, _ = X_test.shape
y_predict = regressor.predict(X_test)
print(f"Classification accuracy on test set: {(np.sum(y_predict == y_test)/n_test_samples) * 100}%")

測試集分類準確率:99.03999999999999%

原文連結:

https://github.com/zotroneneis/machine_learning_basics



往期精彩文章(單擊就可查看):

美國科學院院士、圖靈獎得主:約翰•愛德華•霍普克羅夫特——深度學習

南京大學教授:周志華——深度森林:探索深度神經網絡以外的方法

史丹福大學人工智慧實驗室主任:李飛飛——ImageNet之後,計算機視覺研究最新進展

海軍工程大學教授:賁可榮——人工智慧技術及其應用進展

清華大學:劉洋——基於深度學習的機器翻譯

國防科技大學教授:殷建平——計算機科學理論的過去、現在與未來

清華大學軟體學院院長——劉雲浩:與高中生對話人工智慧

【原創】|日本理化學研究所先進智能研究中心主任——Masashi Sugiyama:弱監督機器學習研究新進展

「人物特寫」清華大學鄧志東:「特徵提取+推理」的小數據學習才是AI崛起的關鍵

明略講堂 | 清華馬少平教授詳解「人工智慧能做什麼?」

【原創】|西安電子科大——焦李成:人工智慧時代後深度學習的挑戰與思考

Michael I. Jordan——計算思維、推斷思維與數據科學

【原創】王飛躍:生成式對抗網絡的機會與挑戰

【原創】|微軟亞洲研究院——劉鐵巖:深度學習前沿

清華大學教授:孫富春——認知時代人工智慧與機器人

清華大學:朱軍博士——When Bayes meets Big Data

加州大學伯克利分校:馬毅——低維結構和高維深模型(視覺)數據

加州大學伯克利分校計算機系教授:Dawn SONG——AI如何建立一個更強的防禦系統

清華大學:劉知遠——知識表示學習及其應用

李飛飛和ImageNet的洪荒之力

清華大學教授:孫富春——教育機器人核心技術展望

從高端人才配置看全國第四輪計算機科學與技術專業一級學科評估結果

長江學者、北京大學教授:黃鐵軍——人工智慧的過去、現在和未來

相關焦點

  • python機器學習預測分析核心算法.pdf
    AI項目體驗地址 https://loveai.tech《Python機器學習 預測分析核心算法》內容簡介  在學習和研究機器學習的時候,面臨令人眼花繚亂的算法,機器學習新手往往會不知所措。本書從算法和Python語言實現的角度,幫助讀者認識機器學習。
  • 算法應用|機器學習python應用,初識機器學習是怎樣滴感受?
    每個算法模型都介紹其較為通用且實用的建模過程,力爭使基礎較差的讀者也能無障礙利用python來使用機器學習算法。1 初識機器學習1.1 什麼是機器學習?實際上並不需要,Python有scikit-learn模塊等可以直接進行建模的調用包,基本只需要學會python的各種基礎的知識和應用,熟悉scikit-learn的相關模型用法,以及包括numpy、pandas、matplotlib模塊在內的常用的數據處理和可視化包,就可以實現各種機器學習算法了。
  • 邏輯回歸算法學習與思考
    邏輯回歸(Logistic regression)是機器學習分類算法的其中一種,核心思想是利用現有數據對分類邊界建立回歸方程,以此進行分類。回歸可以理解為最佳擬合,是一種選擇最優分類的算法。邏輯歸回中會有一些新詞彙需要理解。h函數: 根據輸入的數據預測類別的函數,Andrew Ng的公開課中稱為hypothesis function。
  • 【算法】Python實現機器學習算法
    2 如何用Python實現決策樹系列算法?人生苦短,就用 Python。在 Kaggle 最新發布的全球數據科學/機器學習現狀報告中,來自 50 多個國家的 16000 多位從業者紛紛向新手們推薦 Python 語言,用以學習機器學習。
  • Python機器學習算法入門之梯度下降法實現線性回歸
    線性回歸的目標很簡單,就是用一條線,來擬合這些點,並且使得點集與擬合函數間的誤差最小。如果這個函數曲線是一條直線,那就被稱為線性回歸,如果曲線是一條二次曲線,就被稱為二次回歸。數據來自於GradientDescentExample中的data.csv文件,共100個數據點,如下圖所示:        我們的目標是用一條直線來擬合這些點。
  • 數學推導+純Python實現機器學習算法30:系列總結與感悟
    從第一篇線性回歸的文章開始到現在,已經接近有兩年的時間了。當然,也不是純寫這30篇文章用了這麼長時間,在第14篇Ridge回歸之後中間斷更了10個多月,好在今年抽出時間把全部補齊了。一點總結     整個系列對常用的、主流的機器學習模型與算法進行了梳理,主題只有兩個,一個是數學推導,一個手寫實現。
  • 我的機器學習算法之路
    掌握人工智慧技術,需要從基礎的機器學習算法開始學習,逐漸建立機器學習知識體系。本篇文章 :1.帶大家克服心理上對於機器學習的敬畏,繞開彎路(本人入過很多坑),進入機器學習領域。2.從基本概念和機器學習的應用領域入手,幫助大家建立機器學習的概念模型。3.用最基本的線性回歸和邏輯回歸算法,讓大家掌握機器學習神秘的「三板斧」方法論。
  • 詳解 | 如何用Python實現機器學習算法
    來自:AI科技大本營(ID:rgznai100)用Python實現出來的機器學習算法都是什麼樣子呢
  • 用Python實現機器學習算法:邏輯回歸
    為什麼不用線性回歸的代價函數表示,因為線性回歸的代價函數可能是非凸的,對於分類問題,使用梯度下降很難得到最小值,上面的代價函數是凸函數使用scikit-learn庫中的邏輯回歸模型實現https        for j in range(10):            display_array[pad+i*(20+pad):pad+i*(20+pad)+20,pad+j*(20+pad):pad+j*(20+pad)+20] = (imgData[sum,:].reshape(20,20,order="F"))    # order=F指定以列優先,在matlab中是這樣的,python
  • 最全 Python 算法實現資源匯總!
    整理 | Rachel責編 | Jane出品 | Python大本營(ID:pythonnews)【導語】數據結構與算法是所有人都要學習的基礎課程為了幫助大家在這個假期能提高學習效率,進階 Python 技能,筆者為大家推薦了一份用 Python代碼實現算法的資源帖,涵蓋從入門到高級的各類算法。下文中,筆者首先對項目的整體內容進行了一個歸納,之後為大家選取了幾個內容比較豐富的部分,供大家更高效地使用這一資源。
  • 機器學習算法之LASSO算法
    算法的適用場景: Lasso回歸是有監督機器學習的一種常見的回歸方法。算法的基本邏輯: 一般來說,有監督的機器學習都有以下形式的優化目標:其中第一部分就是Loss函數,第二部分正則化項。由此可以看出基本上所有的有監督機器學習,其核心思想無非就是正則化參數的同時最小化經驗誤差函數。
  • 算法應用|機器學習python應用,簡單機器學習項目實踐
    上一篇文章中介紹了機器學習的簡單知識,還有python中進行機器學習實踐需要的生態環境,接下來將會通過鳶尾花分類這個例子對機器學習做一個簡要的介紹。通過一步一步地實現這個項目來介紹以下內容。導入和使用python中機器學習的各個方面的類庫。
  • 詳解如何用Python實現機器學習算法
    在 Kaggle 最新發布的全球數據科學/機器學習現狀報告中,來自 50 多個國家的 16000 多位從業者紛紛向新手們推薦 Python 語言,用以學習機器學習。那麼,用Python實現出來的機器學習算法都是什麼樣子呢?
  • Python 機器學習算法實踐:嶺回歸和LASSO
    同時也對一種更為簡單的向前逐步回歸計算回歸係數的方法進行了相應的實現。正文通過上一篇《機器學習算法實踐-標準與局部加權線性回歸》中標準線性回歸的公式w=(X^T*X)^(-1)X^T*y中可以看出在計算回歸係數的時候我們需要計算矩陣X^TX的逆,但是如果該矩陣是個奇異矩陣,則無法對其進行求解。那麼什麼情況下該矩陣會有奇異性呢?
  • Python大數據綜合應用 :零基礎入門機器學習、深度學習算法原理與案例
    機器學習、深度學習算法原理與案例實現暨Python大數據綜合應用高級研修班一、課程簡介
  • 小白學數據:教你用Python實現簡單監督學習算法
    有很多方法可以實現有監督學習,我們將探討幾種最常用的方法。根據給定的數據集,機器學習可以分為兩大類:分類(Classification)和回歸(Regression)。如果給定的數據集的輸出值是類別,那麼待解決是分類問題。
  • 數學推導+純Python實現機器學習算法17:XGBoost
    Python機器學習算法實現Author:louwillMachine
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    原標題:機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用高級研修班通信和信息技術創新人才培養工程項目辦公室 通人辦〔2018〕 第5號 機器學習、深度學習算法原理與案例實踐暨Python
  • 數學推導+純Python實現機器學習算法12:貝葉斯網絡
    下面我們直接來用pgmpy實現上述貝葉斯網絡。github.com/luwill/machine-learning-code-writing參考資料:pgmpy: Probabilistic Graphical Models using Python數據挖掘導論往期精彩:數學推導+純Python實現機器學習算法
  • python機器學習之k-means聚類算法(1)
    k-means算法是一種無監督的機器學習算法,雖然是機器學習,但它簡單易於實現。本篇採用python語言,自主編程實現k-menas算法,當然python用專門的庫函數來實現該算法,但本次主要使用該算法闡述編程思想,所以不採用內置函數。採用自主編寫的程序的方式。