機(jī)器學(xué)習(xí)-概率密度估計(jì)及Meanshift算法

一、概率密度估計(jì)

概率密度估計(jì),簡單說就是從離散的數(shù)據(jù)中估計(jì)出連續(xù)的概率密度函數(shù)。這里的離散數(shù)據(jù)即收集到的樣本,它們來自的類別可能擁有某種統(tǒng)計(jì)學(xué)上的特征。最常見的密度估計(jì)方法是直方圖,直方圖是一種很直觀的對數(shù)據(jù)樣本分布進(jìn)行可視化的方法。
概率密度估計(jì)可以分為參數(shù)估計(jì)和非參數(shù)估計(jì):

  • 參數(shù)估計(jì):假設(shè)數(shù)據(jù)服從某一個(gè)分布(比如高斯分布),并從數(shù)據(jù)樣本估計(jì)概率密度函數(shù)的參數(shù),比如HMM, MLE等。
  • 非參數(shù)估計(jì):模型能估計(jì)出任意分布的數(shù)據(jù),比如核密度估計(jì)。

二、Meanshift算法

圖像的特征空間是一個(gè)基于輸入的映射,輸入圖像上的一個(gè)小的自己映射到多維空間上的一個(gè)點(diǎn),當(dāng)整個(gè)輸入都被映射到特征空間里,特征空間里的密度分布就能反映出輸入的特征。結(jié)構(gòu)位置的特征空間只能用非參數(shù)估計(jì)的方法分析,有兩類非參數(shù)聚類方法:分層聚類核密度估計(jì)。密度估計(jì)的基本原理是把特征空間看作是一個(gè)所表示參數(shù)的概率密度函數(shù),密集的區(qū)域就對應(yīng)著概率密度函數(shù)的區(qū)域最大值,也就是這個(gè)未知分布的模式,然后就能得到相應(yīng)的聚類。

1. 核密度估計(jì)

核密度估計(jì)是最常用的密度估計(jì)方法,給定n個(gè)數(shù)據(jù)點(diǎn)x_{i}, i =1,2,...n,分布在d維空間R^d, 有多變量核密度估計(jì)的核K(x),對稱正定帶寬矩陣H, 在點(diǎn)x得到的 \hat{f}(x) = \frac{1}{n}\sum\limits_i^nK_{H}(x-x_{i}),其中 K_{H}(x) = |H|^{-1/2}K(H^{-1/2}x)
常用的帶寬矩陣H = h^2I, 只用一個(gè)參數(shù)h,簡化了運(yùn)算,帶入上面的核密度估計(jì)公式可以得到\hat{f}(x) = \frac{1}{nh^d}\sum\limits_i^nK(\frac{x-x_{i}}{h})
h^d:d維空間里邊長為h的多為立方體的體積
核密度估計(jì)的用密度和它的估計(jì)值之間的均方差來判斷。Epanechnikov核有最小的漸進(jìn)逼近均方差,K_{E}(x) = \begin{cases} 1-x & \quad \text{if } 0<=x <=1\\ 0 & \quad \text{if } x>1 \end{cases}
Epanechnikov核在邊界不可分,所以也常用
K_{N}(x) = exp(-\frac{1}{2} x)
帶入核密度公式之后概率密度估計(jì)公式可以寫為\hat{f}_{h,K}(x) = \frac{c_{k,d}}{nh_u0z1t8os}\sum\limits_i^nk(\|\frac{x-x_{i}}{h}\|^2)
分析f(x)的特征空間的第一步,就是找到它的模式(mode),mode它一般都在梯度為0的位置,而 mean shift 是一個(gè)不需要估計(jì)密度就能找到0的方法。

2. 密度梯度估計(jì)

上面的公式求梯度\nabla\hat{f}_{h,K}(x)= \frac{2c_{k,d}}{nh_{d+2}}\sum\limits_i^n(x-x_{i})k'(\|\frac{x-x_{i}}{h}\|^2)
定義g(x) = -k'(x),可以得到\nabla\hat{f}_{h,K}(x)= \frac{2c_{k,d}}{nh_{d+2}}\sum\limits_i^n(x-x_{i})g(\|\frac{x-x_{i}}{h}\|^2)
= \frac{2c_{k,d}}{nh_{d+2}}[\sum\limits_i^ng(\|\frac{x-x_{i}}{h}\|^2) ][\frac{\sum\limits_i^nx_{i} g(\|\frac{x-x_{i}}{h}\|^2)}{\sum\limits_i^n g(\|\frac{x-x_{i}}{h}\|^2)} -x]
第二項(xiàng)總是正數(shù),所以只要第三項(xiàng)為0,梯度變?yōu)?,得到mean shiftm_{h,G}(x) = \frac{\sum\limits_i^nx_{i} g(\|\frac{x-x_{i}}{h}\|^2)}{\sum\limits_i^n g(\|\frac{x-x_{i}}{h}\|^2)} -x
也就是一個(gè)范圍內(nèi)的數(shù)據(jù)點(diǎn)的權(quán)重均值與中心點(diǎn)x的差。
mean shift的步驟就是重復(fù):

  • 計(jì)算mean shift向量m_{h,G}(x)
  • 根據(jù)向量移動核G(x)的窗口到下一個(gè)中心點(diǎn)
    直到收斂到梯度為0的點(diǎn)。
    G(x)的中心點(diǎn)為y_{j+1} = \frac{\sum\limits_i^nx_{i} g(\|\frac{x-x_{i}}{h}\|^2)}{\sum\limits_i^n g(\|\frac{x-x_{i}}{h}\|^2)} j=1,2,...

3. Mean shift 的應(yīng)用

Mean shift濾波,做圖像平滑去噪等,以及圖像分割。

圖像通常由一個(gè)三維的矩陣表示,其中兩維表示位置,剩下的一個(gè)維度表示通道數(shù)p,在彩色圖片中通道數(shù)為3,在灰色圖片中通道數(shù)為1.當(dāng)位置向量和范圍向量串聯(lián)在一起作為輸入時(shí),需要分別對它們進(jìn)行歸一化,
f(x) = \frac{C}{h_s^2 h_r^p}k(||\frac{x^s}{h_s}||^2)k(||\frac{x^r}{h_r}||^2)
其中x^s表示空間部分,x^r表示范圍的部分,h_s, h_r是核的帶寬,C是一個(gè)常數(shù)。

圖像平滑

圖像平滑是將部分區(qū)域內(nèi)的像素值替換為區(qū)域內(nèi)像素的加權(quán)平均值,從而達(dá)到去除噪聲的目的,但是這樣也會導(dǎo)致圖像信息被消除。而可以保留不連續(xù)性的平滑方法能夠減少局部突變附近,也就是邊緣附近的平滑量,以保留更多信息。

Mean shift用于濾波的主要思想為將圖片的每個(gè)像素對應(yīng)值用特征向量表示,如果用x_i, z_i來表示輸入與輸出,對于每個(gè)像素點(diǎn):

  • 初始化j=1, y_{i,1}=x_i
  • 根據(jù)公式y_{i,j+1}計(jì)算更新核中心點(diǎn)直到收斂
  • 將中心點(diǎn)的值分配給初始點(diǎn) z_i = (x_i^s, y_{i,c}^r)

圖像分割

圖像分割是將圖像劃分為顏色相同的圖像塊。Mean shift用于圖像分割是圖像平滑的一個(gè)擴(kuò)展應(yīng)用。

x_i, z_i表述輸入和處理過的圖像像素,L_i是分割圖像的第i個(gè)像素的標(biāo)簽:

  • 在圖像上運(yùn)行mean shift 濾波的流程,并且保存下所有收斂點(diǎn)的信息z_i
  • 將空間域上距離小于h_s以及范圍域上距離小于h_r的收斂點(diǎn)組合在一起
  • 對于每一個(gè)像素點(diǎn),為它分配對應(yīng)的聚類中心的類別
  • (可選)消除包含少于M個(gè)校內(nèi)告訴的空間區(qū)域

Python實(shí)現(xiàn)圖像分割

使用sklearn庫實(shí)現(xiàn)的mean shift的圖像分割。

sklearn.cluster.estimate_bandwidth(X):估計(jì)帶寬

  • X:輸入
  • quantile:float, default=0.3。應(yīng)在[0,1]。0.5表示使用所有成對距離的中位數(shù)。
  • n_samples:int, default=None。樣本數(shù),如果未指定會使用全部的樣本數(shù),對于大的數(shù)據(jù)集建議使用一個(gè)較小的數(shù)
  • random_state:int, RandomState instance, default=None。用于從輸入點(diǎn)隨機(jī)選擇樣本以進(jìn)行帶寬估計(jì)。
  • n_jobs:int, default=None。并行數(shù)。

sklearn.cluster.MeanShift:mean shift類:

  • fit(X):進(jìn)行聚類
  • fit_predict(X):聚類并返回聚類標(biāo)簽
  • predict(X):預(yù)測X中每個(gè)樣本所屬的最近的聚類。
import cv2                                                                            
from sklearn.cluster import MeanShift, estimate_bandwidth
import matplotlib.pyplot as plt                          

#  讀入圖片
orig_img = cv2.imread("C:/Users/18215/Pictures/trump.jpg")
orig_img = cv2.cvtColor(orig_img, cv2.COLOR_BGR2RGB)
img = copy.deepcopy(orig_img)

# 圖像尺寸
shape = img.shape

# 將圖像轉(zhuǎn)換為 [-1, 3]
shaped_img = np.reshape(img, [-1,3])

# 計(jì)算帶寬
bw = estimate_bandwidth(shaped_img, quantile=0.1, n_samples=100)
ms = MeanShift(bandwidth=bw, bin_seeding=True)
ms.fit(shaped_img)

# meanshift后不同聚類 對應(yīng)的(r,g,b)
labels= ms.labels_

# meanshift后的顏色
cluster_center = ms.cluster_centers_

labels_unique = np.unique(labels)
n_cluster = len(labels_unique)

segImg = np.reshape(labels, shape[:2])

plt.figure()
plt.subplot(121), plt.imshow(orig_img), plt.axis('off'), plt.title('original image', size=20)
plt.subplot(122), plt.imshow(segImg), plt.axis('off'), plt.title('segmented image with Meanshift', size=20)
plt.show()                                             
原圖和分割圖

參考文獻(xiàn):

[1] Comaniciu D, Meer P. Mean shift: A robust approach toward feature space analysis[J]. IEEE Transactions on pattern analysis and machine intelligence, 2002, 24(5): 603-619.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容