原
2023年11月02日 23:00:51
k均值(k-means)演算法是一種無監督的聚類學習演算法,他嘗試找到樣本資料的自然類別,分類是k由使用者自己定義,k均值在不需要任何其他先驗知識的情況下,依據演算法的迭代規則,把樣本劃分為k類。k均值是最常用的聚類技術之一,通過不斷迭代和移動質心來完成分類,與均值漂移演算法的原理很相似。
k均值演算法的實現過程:
k均值的核心就是不斷移動類別劃分的中心點,直到該點穩定下來或者達到所設定的最大迭代次數,這時當前中心點所劃分的類別就是最終的k均值對樣本資料的聚類。
下圖是對k-means迭代過程的簡單演示。假設有n 個資料樣本需要進行分類,這裡k取值 為2:
(a)初始資料集合
(b)隨機選取兩個點作為初始聚類中心
(c)計算每個點到聚類中心的距離,並聚類到離該點最近的聚類中去
(d)計算每個聚類中所有點的座標平均值,並將這個平均值 作為新的聚類中心
(e)重複(c),計算每個點到聚類中心的距離,並聚類到離該點最近的聚類中去
(f) 重複(d),計算每個聚類中所有點的座標平均值,並將這個平均值作為新的聚類中心,直到滿足迭代條件。
雖然k-means演算法原理簡單,也有自身的缺陷:
以下是用k-means演算法對一幅影象進行分割的**實現:
原始影象:#include
#include
#include
#include
#include
using
namespace cv;
using
namespace
std;
intmain
(int argc, char* argv)
}int clustercount =
4; mat centers
(clustercount, 1, samples.type());
kmeans(samples, clustercount, labels,
termcriteria( cv_termcrit_eps+cv_termcrit_iter,
10,
1.0),
3, kmeans_pp_centers, centers);
//我們已知有3個聚類,用不同的灰度層表示。
mat img1
(img.rows, img.cols, cv_8uc1)
;
float step=
255/(clustercount -
1);
k=0;
for(i=
0; i < img1.rows; i++)
}namedwindow(
「k-means分割效果」,
0);
imshow(
「k-means分割效果」, img1);
waitkey();
return
0;
}
由於原影象素大小是4160x2336,計算時候也沒有進行壓縮,所以k-means的迭代消耗時間也是很可觀的,在我的機器上整個耗時約60s。
對影象進行分割,採用k=2效果:
k=3效果:
k=4效果:
非學,無以致疑;非問,無以廣識
k均值演算法
k-means
影象分割
個人分類:
機器學習
所屬專欄:
opencv下的機器學習
opencv與
opencv取整
opencv斷言
opencv生長
opencv修復
▼檢視關於本篇文章更多資訊
K均值演算法 應用
1.應用k means演算法進行壓縮 讀取一張 觀察檔案大小,佔記憶體大小,資料結構,線性化 用kmeans對畫素顏色進行聚類 獲取每個畫素的顏色類別,每個類別的顏色 觀察壓縮的檔案大小,佔記憶體大小 原圖大小 image.size 7 print 原圖記憶體 sys.getsizeof image...
K 均值演算法
動態聚類方法是模式識別中一種普遍採用的方法,它具有以下3個要點 1 選定某種距離度量作為樣本間的相似性度量 2 確定某個評價聚類結果質量的準則函式 3 給定某個初始分類,然後用迭代演算法找出使準則函式取極值的最好的聚類結果 k means演算法 輸入 聚類個數k,以及包含 n個資料物件的資料庫。輸出...
K均值演算法
假設需要聚成k個類 演算法先會隨機從資料集中選取k個點,把他們當做k個聚類的中心點 依次計算資料集中的每乙個點與各個中心點的距離,離哪個中心點近,就劃分到那個中心點對應的聚類下 計算分到同一類簇下,所有點的均值,更新中心點,重複 直至達到迭代結束條件 import numpy as np impor...