小姐姐帶你一起學:如何用Python實現7種機器學習演算法(附程式碼)
編譯 | 林椿眄
出品 | AI科技大本營(公眾號ID:rgznai100)
【AI科技大本營導讀】Python 被稱為是最接近 AI 的語言。最近一位名叫Anna-Lena Popkes的小姐姐在GitHub上分享了自己如何使用Python(3.6及以上版本)實現7種機器學習演算法的筆記,並附有完整程式碼。所有這些演算法的實現都沒有使用其他機器學習庫。這份筆記可以幫大家對演算法以及其底層結構有個基本的瞭解,但並不是提供最有效的實現。
小姐姐史是德國波恩大學電腦科學專業的研究生,主要關注機器學習和神經網路。
七種演算法包括:
線性迴歸演算法
Logistic 迴歸演算法
感知器
K 最近鄰演算法
K 均值聚類演算法
含單隱層的神經網路
多項式的 Logistic 迴歸演算法
▌1. 線性迴歸演算法
線上性迴歸中,我們想要建立一個模型,來擬合一個因變數 y 與一個或多個獨立自變數(預測變數) x 之間的關係。
給定:
資料集
是d-維向量
是一個目標變數,它是一個標量
線性迴歸模型可以理解為一個非常簡單的神經網路:
它有一個實值加權向量
它有一個實值偏置量 b
它使用恆等函式作為其啟用函式
線性迴歸模型可以使用以下方法進行訓練
a) 梯度下降法
b) 正態方程(封閉形式解):
其中 X 是一個矩陣,其形式為,包含所有訓練樣本的維度資訊。
而正態方程需要計算的轉置。這個操作的計算複雜度介於)和之間,而這取決於所選擇的實現方法。因此,如果訓練集中資料的特徵數量很大,那麼使用正態方程訓練的過程將變得非常緩慢。
線性迴歸模型的訓練過程有不同的步驟。首先(在步驟 0 中),模型的引數將被初始化。在達到指定訓練次數或引數收斂前,重複以下其他步驟。
第 0 步:
用0 (或小的隨機值)來初始化權重向量和偏置量,或者直接使用正態方程計算模型引數
第 1 步(只有在使用梯度下降法訓練時需要):
計算輸入的特徵與權重值的線性組合,這可以通過向量化和向量傳播來對所有訓練樣本進行處理:
其中 X 是所有訓練樣本的維度矩陣,其形式為;· 表示點積。
第 2 步(只有在使用梯度下降法訓練時需要):
用均方誤差計算訓練集上的損失:
第 3 步(只有在使用梯度下降法訓練時需要):
對每個引數,計算其對損失函式的偏導數:
所有偏導數的梯度計算如下:
第 4 步(只有在使用梯度下降法訓練時需要):
更新權重向量和偏置量:
其中,表示學習率。
In [4]:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
np.random.seed(123)
資料集
In [5]:
# We will use a simple training set
X = 2 * np.random.rand(500, 1)
y = 5 + 3 * X + np.random.randn(500, 1)
fig = plt.figure(figsize=(8,6))
plt.scatter(X, y)
plt.title("Dataset")
plt.xlabel("First feature")
plt.ylabel("Second feature")
plt.show()
In [6]:
# Split the data into a training and test set
X_train, X_test, y_train, y_test = train_test_split(X, y)
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: (375, 1) Shape y_train: (375, 1) Shape X_test: (125, 1) Shape y_test: (125, 1)
線性迴歸分類
In [23]:
class LinearRegression:
def __init__(self):
pass
def train_gradient_descent(self, X, y, learning_rate=0.01, n_iters=100):
"""
Trains a linear regression model using gradient descent
"""
# Step 0: Initialize the parameters
n_samples, n_features = X.shape
self.weights = np.zeros(shape=(n_features,1))
self.bias = 0
costs = []
for i in range(n_iters):
# Step 1: Compute a linear combination of the input features and weights
y_predict = np.dot(X, self.weights) + self.bias
# Step 2: Compute cost over training set
cost = (1 / n_samples) * np.sum((y_predict - y)**2)
costs.append(cost)
if i % 100 == 0:
print(f"Cost at iteration {i}: {cost}")
# Step 3: Compute the gradients
dJ_dw = (2 / n_samples) * np.dot(X.T, (y_predict - y))
dJ_db = (2 / n_samples) * np.sum((y_predict - y))
# Step 4: Update the parameters
self.weights = self.weights - learning_rate * dJ_dw
self.bias = self.bias - learning_rate * dJ_db
return self.weights, self.bias, costs
def train_normal_equation(self, X, y):
"""
Trains a linear regression model using the normal equation
"""
self.weights = np.dot(np.dot(np.linalg.inv(np.dot(X.T, X)), X.T), y)
self.bias = 0
return self.weights, self.bias
def predict(self, X):
return np.dot(X, self.weights) + self.bias
使用梯度下降進行訓練
In [24]:
regressor = LinearRegression()
w_trained, b_trained, costs = regressor.train_gradient_descent(X_train, y_train, learning_rate=0.005, n_iters=600)
fig = plt.figure(figsize=(8,6))
plt.plot(np.arange(n_iters), costs)
plt.title("Development of cost during training")
plt.xlabel("Number of iterations")
plt.ylabel("Cost")
plt.show()
Cost at iteration 0: 66.45256981003433 Cost at iteration 100: 2.2084346146095934 Cost at iteration 200: 1.2797812854182806 Cost at iteration 300: 1.2042189195356685 Cost at iteration 400: 1.1564867816573 Cost at iteration 500: 1.121391041394467
測試(梯度下降模型)
In [28]:
n_samples, _ = X_train.shape
n_samples_test, _ = X_test.shape
y_p_train = regressor.predict(X_train)
y_p_test = regressor.predict(X_test)
error_train = (1 / n_samples) * np.sum((y_p_train - y_train) ** 2)
error_test = (1 / n_samples_test) * np.sum((y_p_test - y_test) ** 2)
print(f"Error on training set: {np.round(error_train, 4)}")
print(f"Error on test set: {np.round(error_test)}")
Error on training set: 1.0955
Error on test set: 1.0
使用正規方程(normal equation)訓練
# To compute the parameters using the normal equation, we add a bias value of 1 to each input example
X_b_train = np.c_[np.ones((n_samples)), X_train]
X_b_test = np.c_[np.ones((n_samples_test)), X_test]
reg_normal = LinearRegression()
w_trained = reg_normal.train_normal_equation(X_b_train, y_train)
測試(正規方程模型)
y_p_train = reg_normal.predict(X_b_train)
y_p_test = reg_normal.predict(X_b_test)
error_train = (1 / n_samples) * np.sum((y_p_train - y_train) ** 2)
error_test = (1 / n_samples_test) * np.sum((y_p_test - y_test) ** 2)
print(f"Error on training set: {np.round(error_train, 4)}")
print(f"Error on test set: {np.round(error_test, 4)}")
Error on training set: 1.0228
Error on test set: 1.0432
視覺化測試預測
# Plot the test predictions
fig = plt.figure(figsize=(8,6))
plt.scatter(X_train, y_train)
plt.scatter(X_test, y_p_test)
plt.xlabel("First feature")
plt.ylabel("Second feature")
plt.show()
▌2. Logistic 迴歸演算法
在 Logistic 迴歸中,我們試圖對給定輸入特徵的線性組合進行建模,來得到其二元變數的輸出結果。例如,我們可以嘗試使用競選候選人花費的金錢和時間資訊來預測選舉的結果(勝或負)。Logistic 迴歸演算法的工作原理如下。
相關推薦
小姐姐帶你一起學:如何用Python實現7種機器學習演算法(附程式碼)
編譯 | 林椿眄出品 | AI科技大本營(公眾號ID:rgznai100)【AI科技大本營導讀】
第002講:用Python設計第一個遊戲|學習記錄(小甲魚零基礎入門學習Python)
(標答出處: 魚C論壇) 《零基礎入門學習Python》 測試題: 什麼是BIF? BIF指的是bulit in function,指的是Python裡的內建函式。 用課堂上小甲魚教的方法數一數 Python3 提供了多少個 BIF? 輸入&g
Python爬蟲實戰:抓取並儲存百度雲資源(附程式碼)
尋找並分析百度雲的轉存api 首先你得有一個百度雲盤的賬號,然後登入,用瀏覽器(這裡用火狐瀏覽器做示範)開啟一個分享連結。F12開啟控制檯進行抓包。手動進行轉存操作:全選檔案->儲存到網盤->選擇路徑->確定。點選【確定】前建議先清空一下抓包記錄,這樣可以精確定位到轉存的api,這就是
案例:用python實現翻譯小程序
luchangshan5200案例:翻譯小程序 #實現一個翻譯小程序 #1 可以查詢單詞 #2 可以自定義補充單詞解釋 #3 可以刪除某個單詞 print(‘歡迎來到大寶dayday見小詞典‘.center(30,‘-‘)) orig_dict = {‘中文‘:‘chinese‘,‘代碼‘:‘code‘,‘
你真的會用PYTHON的裝飾器了嗎?(老鐵)
本文結構: 無參裝飾器的一般形式 a、 解決原生函式有參問題 &nbs
十個例子,教你用統計學方法高效完成機器學習專案(下)【楚才國科】
五、資料準備: 資料一般不會直接拿來建模。為了改變資料的形狀或結構,使它更適用於選定的問題架構或學習演算法,需要對資料進行必要的轉化。 資料準備也會用到統計模型,例如: 1、縮放。例如標準化和規範化。 2、編碼。例如整數編碼和獨熱編碼。 3、變換。例如 Box-Cox
十個例子,教你用統計學方法高效完成機器學習專案(上)【楚才國科】
統計學和機器學習是兩個聯絡特別緊密的領域 事實上,這兩者的界限有時候非常模糊。然而有一些明顯屬於統計學領域的方法,不僅可用於機器學習的專案,並且極具價值。公平地說,需要統計學方法來有效地完成機器學習預測建模專案。 一、問題架構: 這包括了問題型別的選擇,例如是迴歸還是分類,也許
類方法實現:用python實現一個簡單的單詞本,添加/查找/刪除單詞。
end code div keys style 成功 move print utf 1.實現一個簡單的單詞本,功能: ①添加單詞,當所添加的單詞已存在時,讓用戶知道 ②查找單詞,當查找的單詞不存在時,讓用戶知道 ③刪除單詞,當刪除的單詞不存在時,讓用戶知道 以上
獨家 | 手把手教你用Python進行Web抓取(附程式碼)
作為一名資料科學家,我在工作中所做的第一件事就是網路資料採集。使用程式碼從網站收集資料,當時對我來說是一個完全陌生的概念,但它是最合理、最容易獲取的資料來源之一。經過幾次嘗試,網路抓取已經成為我的第二天性,也是我幾乎每天使用的技能之一。 在本教程中,我將介紹一個簡單的例子,說明如何抓取一個網站,
練習三十二:用python實現:按相反的順序輸出列表的每一位值
用python實現:按相反的順序輸出列表的每一位值 1. 使用list[::-1] 1 list1 = ["one","two","three","four"] 2 for i in list1[::-1]:#list[::-1]結果為列表的反向 3 print(i) 2. 使用l
第017講:函式 - Python的樂高積木 | 學習記錄(小甲魚零基礎入門學習Python)
(標答出處: 魚C論壇) 《零基礎入門學習Python》 測試題: 你有聽說過DRY嗎? DRY(Don’t repeat yourself),進行程式設計時相同的程式碼不要重複寫,最好只寫一次,然後可以在其他地方直接引用。 都是重複一段程式碼,為什麼我要使用函式
實戰:用Python實現隨機森林
因為有Scikit-Learn這樣的庫,現在用Python實現任何機器學習演算法都非常容易。實際上,我們現在不需要任何潛在的知識來了解模型如何工作。雖然不需要了解所有細節,但瞭解模型如何訓練和預測對工作仍有幫助。比如:如果效能不如預期,我們可以診斷模型或當我們想要說服其他人使用我們的模型時,我們可以向他們解
Python每日一題:第4題:用Python實現斐波那契數列
這是Python之禪和他朋友們在知識星球的第4題:用Python實現斐波那契數列 斐波那契數列(Fibonacci)最早由印度數學家Gopala提出,而第一個真正研究斐波那契數列的是義大利數學家 Leonardo Fibonacci,斐波那契數列的定義很簡單,用數學函式可表示為: 數列從0
Python3學習筆記(四):用Python實現深度優先
這裡主要是用Python實現下深度優先的概念,由於程式碼寫得比較隨意,就沒有封裝成類,而是寫成一個函式 用一個列表做為實驗資料,模擬成二叉樹結構,用遞迴的方式不斷獲取二叉樹上的左節點,一直到左節點 序號超出列表範圍,然後迴歸獲取右節點,以此來實現深度優先。 以下是程式碼
區塊鏈能養貓養狗了?!手把手帶你復現AI+區塊鏈寫碼全過程!(附程式碼)
區塊鏈養貓養狗、區塊鏈遊戲、區塊鏈遊戲,區塊鏈旅遊……打著區塊鏈名頭的專案蜂擁上線。 如何將區塊鏈和AI兩種不同技術結合?如何在python中編寫工作證明演算法?一致性演算法有哪些? 雷鋒字幕組特別編譯了本期「區塊鏈一致性演算法和人工
實戰:用Python實現隨機森林!
因為有 Scikit-Learn 這樣的庫,現在用Python實現任何機器學習演算法都非常容易。實際上,我們現在不需要任何潛在的知識來了解模型如何工作。雖然不需要了解所有細節,但瞭解模型如何訓練和預測對工作仍有幫助。比如:如果效能不如預期,我們可以診斷模型或當我們想要說服其他人使用我們的模型時,我們
獨家 | 手把手教你用Python建立簡單的神經網路(附程式碼)
作者:Michael J.Garbade 翻譯:陳之炎 校對:丁楠雅 本文共2000字,建議閱讀9分鐘。本文將為你演示如何建立一個神經網路,帶你深入瞭解神經網路的工作方式。 瞭解神經網路工作方式的最佳途徑莫過於親自建立一個神經網路,本文將演示如何做到這一點。
NVIDIA新作解讀:用GAN生成前所未有的高清影象(附PyTorch復現) | PaperDaily #15
在碎片化閱讀充斥眼球的時代,越來越少的人會去關注每篇論文背後的探索和思考。 在這個欄目裡,你會快速 get 每篇精選論文的亮點和痛點,時刻緊跟 AI 前沿成果。 點選本文底部的「閱讀
機器學習實驗(十一):基於WiFi fingerprints用自編碼器(Autoencoders)和神經網路(Neural Network)進行定位_2(keras版)
Epoch 1/20 6s - loss: 0.7049 Epoch 2/20 6s - loss: 0.6808 Epoch 3/20 5s - loss: 0.6752 Epoch 4/20 5s - loss: 0.6724 Epoch 5/20 5s - loss: 0.6703 Epoch 6/2