Gaussian Process——機器學習中的神經網絡

一、簡介

Gaussian Process,又稱高斯過程,是一種常用於機器學習、模式識別領域的統計模型。它是對於一組樣本數據的分布進行建模,而這組數據可以是從一個射箭比賽的得分表到一些產品的銷售數據都可以當作它的輸入數據,它的本質目的是通過估計樣本數據的分布來預測未知數據的分布和位置。

高斯過程在貝葉斯框架下對於一個潛在函數f(x)的分布進行建模,使得這個函數能夠被用在回歸和分類的場景中。高斯過程雖然和神經網絡相比,運算速度較慢,但它不需要對函數進行參數化的變化,更加自然地處理非線性函數變換。

二、高斯過程的基本概念

1.高斯分布

高斯分布是機器學習中經常用到的概率分布之一,又稱正態分布。它的分布規律滿足鐘形曲線,這是由於它服從一個均值為μ、方差為σ的分布。

在高斯過程中,我們採用高斯分布來描述一個無限維隨機向量的分布,給定無限多個變量的聯合概率分布。

2.協方差函數(kernel function)

通過協方差函數可以給出樣本之間的關聯程度,同時形成有效的數據插值。例如,我們可以用RBF協方差函數來構造高斯過程,由此可以得到與最近鄰距離有關的數據相似度。協方差函數決定了函數值之間的相關性或者說關聯度。例如,對於無限維的高斯過程,協方差就指定了噪聲的分布。

3.樣本點與擬合函數

我們用一組樣本點來對高斯過程進行模型訓練,通過樣本點來構建一個擬合函數f(x),使得這個函數可以用來對未知點進行預測。在高斯過程中,我們可以認為擬合函數滿足高斯分布,擬合函數的均值和方差可以由樣本點來計算獲得。

三、高斯過程的應用

1.回歸問題

高斯過程可以作為回歸問題的一種解決辦法。在回歸問題中,我們關注的是連續變量的預測問題。在通過樣本點構造高斯過程的擬合函數後,我們可以根據給定的輸入變量,通過擬合函數來得到相應的輸出值。

2.分類問題

高斯過程也可以用於二元和多元分類問題。通過建立一個高斯過程分類器,可以通過樣本點的分布來判定測試點的類別。由於高斯過程是對於函數的連續性和可導性進行處理的,因而在分類問題中一般比邏輯回歸更好的表現效果。

四、代碼說明

1.高斯過程回歸

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal

# RBF 協方差函數
def RBF_kernel(X1, X2, l=1.0, sigma_f=1.0):  
    # 計算距離矩陣
    dist_matrix = np.sum(X1**2,1).reshape(-1,1) + np.sum(X2**2,1) - 2*np.dot(X1,X2.T)
    return sigma_f**2 * np.exp(-0.5 * dist_matrix / l**2)

class GP_regression(object):
    def __init__(self, kernel=RBF_kernel):
        self.kernel = kernel
    
    def fit(self, X_train, y_train, noise=1e-8):
        self.X_train = X_train
        self.y_train = y_train
        self.noise = noise
        # 計算訓練數據協方差矩陣
        K = self.kernel(X_train, X_train)
        self.K = K + noise * np.eye(K.shape[0])
        self.K_inv = np.linalg.inv(self.K)
        return self
    
    def predict(self, X_test):
        # 計算測試數據與訓練數據協方差矩陣
        k_trans = self.kernel(self.X_train, X_test)
        # 計算預測值與方差
        y_mean = k_trans.T.dot(self.K_inv).dot(self.y_train)
        cov = self.kernel(X_test, X_test) - k_trans.T.dot(self.K_inv).dot(k_trans)
        return y_mean, cov
    
# 畫出擬合曲線與置信區間
def plot_gp(X, y, X_test, y_mean, cov):
    plt.scatter(X, y)
    plt.plot(X_test, y_mean, 'r')
    plt.fill_between(X_test.flat, y_mean-1.96*np.sqrt(np.diag(cov)), y_mean+1.96*np.sqrt(np.diag(cov)), alpha=0.1)
    plt.show()

# 模擬數據
X_train = np.array([1.0, 3.0, 5.0, 6.0, 7.0, 8.0]).reshape(-1,1)
y_train = np.sin(X_train) + np.random.normal(0, 0.2, size=(6,1))

# 預測數據集
X_test = np.arange(0, 10, 0.1).reshape(-1,1)

gp = GP_regression()
gp.fit(X_train, y_train)

y_mean, cov = gp.predict(X_test)
plot_gp(X_train, y_train, X_test, y_mean, cov)

2.高斯過程分類

import numpy as np
from scipy.stats import multivariate_normal

# 協方差函數
def kernel(X1, X2, l=1.0, sigma_f=1.0):  
    # 計算距離矩陣
    dist_matrix = np.sum(X1**2,1).reshape(-1,1) + np.sum(X2**2,1) - 2*np.dot(X1,X2.T)
    return sigma_f**2 * np.exp(-0.5 * dist_matrix / l**2)


class GP_classification(object):
    def __init__(self, kernel=kernel):
        self.kernel = kernel
    
    def fit(self, X_train, y_train, noise=1e-8):
        self.X_train = X_train
        self.y_train = y_train[:,None]
        self.noise = noise
        
        # 計算訓練數據協方差矩陣
        K = self.kernel(X_train, X_train)
        self.K = K + noise * np.eye(K.shape[0])
        self.K_inv = np.linalg.inv(self.K)
        
        return self
    
    def predict(self, X_test):
        # 計算測試數據與訓練數據協方差矩陣
        k_trans = self.kernel(self.X_train, X_test)
        # 計算預測值與方差
        y_mean = k_trans.T.dot(self.K_inv).dot(self.y_train)
        cov = self.kernel(X_test, X_test) - k_trans.T.dot(self.K_inv).dot(k_trans)
        return y_mean, cov
    
    def predict_proba(self, X_test):
        # 計算測試點均值和方差
        y_mean, cov = self.predict(X_test)
        # 計算預測概率
        p = multivariate_normal.cdf(0, mean=y_mean.flatten(), cov=cov, allow_singular=True)
        # 轉換成二分類的概率
        p = np.stack([1-p, p], axis=1)
        return p
    
# 模擬數據
X = np.random.uniform(-3., 3., size=(200, 1))
y = np.sin(X) + np.random.normal(0, 0.1, size=(200, 1))
y = np.where(y>=0, 1, 0)

# 預測數據集
X_test = np.linspace(-5., 5., 100).reshape(-1,1)

gp = GP_classification()
gp.fit(X, y)

P_test = gp.predict_proba(X_test)

plt.scatter(X, y, alpha=0.5)
plt.plot(X_test, P_test[:, 1], label='p(y=1|x)')
plt.plot(X_test, P_test[:, 0], label='p(y=0|x)')
plt.legend()
plt.show()

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/292110.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-25 14:07
下一篇 2024-12-25 14:07

相關推薦

  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • 使用boofcv進行圖像處理和機器視覺

    本文將詳細介紹使用boofcv進行圖像處理和機器視覺的方法和實踐。首先,我們將介紹boofcv的概述和安裝方法,然後分別介紹它的圖像處理、相機校準和機器學習功能。 一、概述和安裝 …

    編程 2025-04-28
  • Python實現BP神經網絡預測模型

    BP神經網絡在許多領域都有着廣泛的應用,如數據挖掘、預測分析等等。而Python的科學計算庫和機器學習庫也提供了很多的方法來實現BP神經網絡的構建和使用,本篇文章將詳細介紹在Pyt…

    編程 2025-04-28
  • 遺傳算法優化神經網絡ppt

    本文將從多個方面對遺傳算法優化神經網絡ppt進行詳細闡述,並給出對應的代碼示例。 一、遺傳算法介紹 遺傳算法(Genetic Algorithm,GA)是一種基於遺傳規律進行優化搜…

    編程 2025-04-27
  • ABCNet_v2——優秀的神經網絡模型

    ABCNet_v2是一個出色的神經網絡模型,它可以高效地完成許多複雜的任務,包括圖像識別、語言處理和機器翻譯等。它的性能比許多常規模型更加優越,已經被廣泛地應用於各種領域。 一、結…

    編程 2025-04-27
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • 深入理解ANN人工神經網絡

    一、什麼是ANN人工神經網絡 ANN人工神經網絡(Artificial Neural Network)是一種模擬人類神經網絡行為和功能的數學模型。它是一個由多個神經元相互連接組成的…

    編程 2025-04-25
  • Bandit算法——讓機器學會動態決策

    一、什麼是Bandit算法 Bandit算法是通過不斷嘗試並學習結果來達到最優決策的一種算法。它屬於強化學習的範疇,主要應用於動態決策問題中,例如推薦系統、廣告投放等領域。 以廣告…

    編程 2025-04-24
  • 神經網絡量化

    一、什麼是神經網絡量化? 神經網絡量化是指對神經網絡中的權重和激活函數進行壓縮和量化,使得神經網絡模型在保證較高精度的前提下,減小計算量和模型大小的方法。量化可以在不影響模型性能的…

    編程 2025-04-24
  • Bootstrap Sampling:一個通用的機器學習方法

    一、Bootstrap Sampling是什麼 Bootstrap Sampling是一種常用的統計學方法,也是機器學習領域裡一個通用的方法。Bootstrap Sampling(…

    編程 2025-04-24

發表回復

登錄後才能評論