K-Means聚類算法思想及實現

K-Means聚類概念:

K-Means聚類是最常用的聚類算法,最初起源于信號處理,其目標是將數據點劃分為K個類簇, 找到每個簇的中心并使其度量最小化。 該算法的最大優點是簡單、便于理解,運算速度較快,缺點是只能應用于連續型數據,并且要 在聚類前指定聚集的類簇數。 k-means算法是一種原型聚類算法。

K-Means聚類分析流程:

第一步,確定K值,即將數據集聚集成K個類簇或小組。
第二步,從數據集中隨機選擇K個數據點作為質心(Centroid)或數據中心。
第三步,分別計算每個點到每個質心之間的距離,并將每個點劃分到離最近質心的小組。
第四步,當每個質心都聚集了一些點后,重新定義算法選出新的質心。(對于每個簇,計 算其均值,即得到新的k個質心點)
第五步,迭代執行第三步到第四步,直到迭代終止條件滿足為止(分類結果不再變化)
舉個例子:
起始情況:
在這里插入圖片描述
在這里插入圖片描述
第一步,確定K值,即將數據集聚集成K個類簇或小組。 ----這里我們選K=2
第二步,從數據集中隨機選擇K個數據點作為質心(Centroid)或數 據中心。----假設我們選擇P1和P2作為初始的質心
第三步,分別計算每個點到每個質心之間的距離,并將每個點劃分 到離最近質心的小組。 ----計算P3到P1的距離:√10 = 3.16; ----計算P3到P2的距離:√((3-1)2+(1-2)2 = √5 = 2.24; ----所以P3離P2更近,P3就加入P2的簇。同理,P4、P5、P6;
在這里插入圖片描述
P3到P6都跟P2更近,所以第一次分組的結果是:
? 組A:P1
? 組B:P2、P3、P4、P5、P6
在這里插入圖片描述
按照上一次的方法選出兩個新的虛擬質心: —P哥1(1.33,1), P哥2(9,8.33)。
第三次計算點到質心的距離:
— 這時可以看到P1、P2、P3離P哥1更近,P4、 P5、P6離P哥2更近。
所以第三次分組的結果是:
? 組A:P1、P2、P3
? 組B:P4、P5、P6
我們發現,這次分組的結果和上次沒有任何變化了,說 明已經收斂,聚類結束。

K-Means聚類應用:

在圖像處理中,通過K-Means聚類算法可以實現圖像分割、圖像聚類、圖像識別等操作。 我們通過K-Means可以將這些像素點聚類成K個簇,然后使用每個簇內的質心點來替換簇內所有 的像素點,這樣就能實現在不改變分辨率的情況下量化壓縮圖像顏色,實現圖像顏色層級分割。

K-Means聚類優缺點:

優點:
1.是解決聚類問題的一種經典算法,簡單、快速
2.對處理大數據集,該算法保持可伸縮性和高效率
3.當結果簇是密集的,它的效果較好
缺點:
1.在簇的平均值可被定義的情況下才能使用,可能不適用于某些應用
2.必須事先給出k(要生成的簇的數目),而且對初值敏感,對于不同的初始值,可能會導致不同結果。
3.不適合于發現非凸形狀的簇或者大小差別很大的簇
4.對躁聲和孤立點數據敏感

算法實現

簡單的灰色圖像聚類:

'''
在OpenCV中,Kmeans()函數原型如下所示:
compactness, Labels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])返回值:compactness:緊密度,返回每個點到相應重心的距離的平方和labels:結果標記,每個成員被標記為分組的序號,如 0,1,2,3,4...等centers:由聚類的中心組成的數組輸入值:data表示聚類數據,最好是np.flloat32類型的N維點集K表示聚類類簇數bestLabels表示輸出的整數數組,用于存儲每個樣本的聚類標簽索引criteria表示算法終止條件,即最大迭代次數或所需精度。在某些迭代中,一旦每個簇中心的移動小于criteria.epsilon,算法就會停止attempts表示重復試驗kmeans算法的次數,算法返回產生最佳緊湊性的標簽flags表示初始中心的選擇,兩種方法是cv2.KMEANS_PP_CENTERS ;和cv2.KMEANS_RANDOM_CENTERScenters表示集群中心的輸出矩陣,每個集群中心為一行數據
'''import cv2
import numpy as np
import matplotlib.pyplot as plt#讀取原始圖像灰度顏色
img = cv2.imread('lenna.png', 0) 
print (img.shape)#獲取圖像高度、寬度
rows, cols = img.shape[:]#圖像二維像素轉換為一維
data = img.reshape((rows * cols, 1))
data = np.float32(data)#定義終止條件 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#每次隨機選擇初始中心
flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚類 聚集成4類
compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)#生成最終圖像
dst = labels.reshape((img.shape[0], img.shape[1]))#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']#顯示圖像
titles = [u'原始圖像', u'聚類圖像']  
images = [img, dst]  
for i in range(2):  plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i])  plt.xticks([]),plt.yticks([])  
plt.show()

結果展示:
在這里插入圖片描述
彩色圖像不同類數的聚類效果對比:

import cv2
import numpy as np
import matplotlib.pyplot as plt#讀取原始圖像
img = cv2.imread('lenna.png') 
print (img.shape)#圖像二維像素轉換為一維
data = img.reshape((-1,3))
#先前我們不知道z的shape屬性是多少,但是想讓z變成只有三列
data = np.float32(data)
#轉換為float32位#定義終止條件(type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#隨機選定初始中心
flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚類 聚集成2類
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)#K-Means聚類 聚集成4類
compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)#K-Means聚類 聚集成8類
compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)#K-Means聚類 聚集成16類
compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)#K-Means聚類 聚集成64類
compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)#圖像轉換回uint8二維類型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
dst2 = res.reshape((img.shape))centers4 = np.uint8(centers4)
res = centers4[labels4.flatten()]
dst4 = res.reshape((img.shape))centers8 = np.uint8(centers8)
res = centers8[labels8.flatten()]
dst8 = res.reshape((img.shape))centers16 = np.uint8(centers16)
res = centers16[labels16.flatten()]
dst16 = res.reshape((img.shape))centers64 = np.uint8(centers64)
res = centers64[labels64.flatten()]
dst64 = res.reshape((img.shape))#圖像轉換為RGB顯示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB)
dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB)
dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB)
dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)#用來正常顯示中文標簽
plt.rcParams['font.sans-serif']=['SimHei']#顯示圖像
titles = [u'原始圖像', u'聚類圖像 K=2', u'聚類圖像 K=4',u'聚類圖像 K=8', u'聚類圖像 K=16',  u'聚類圖像 K=64']  
images = [img, dst2, dst4, dst8, dst16, dst64]  
for i in range(6):  plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i])  plt.xticks([]),plt.yticks([])  #xticks()函數可以用來設置使x軸上ticks隱藏,即將空數組賦予它,則沒有tick會顯示在x軸上
plt.show()

輸出結果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389534.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(2.1)DDL增強功能-數據類型、同義詞、分區表

1.數據類型 (1)常用數據類型  1.整數類型 int 存儲范圍是-2,147,483,648到2,147,483,647之間的整數,主鍵列常設置此類型。 (每個數值占用 4字節) smallint 存儲范圍是-32,768 到 32,767 之間的整數,用…

充分利用昂貴的分析

By Noor Malik努爾馬利克(Noor Malik) Let’s say you write a query in Deephaven which performs a lengthy and expensive analysis, resulting in a live table. For example, in a previous project, I wrote a query which pulled data from an RSS feed to create a li…

【java并發編程藝術學習】(一)初衷、感想與筆記目錄

不忘初心,方得始終。 學習java編程這么長時間,自認為在項目功能需求開發中沒啥問題,但是之前的幾次面試和跟一些勤奮的或者小牛、大牛級別的人的接觸中,才發現自己的無知與淺薄。 學習總得有個方向吧,現階段就想把并發…

層次聚類和密度聚類思想及實現

層次聚類 層次聚類的概念: 層次聚類是一種很直觀的算法。顧名思義就是要一層一層地進行聚類。 層次法(Hierarchicalmethods)先計算樣本之間的距離。每次將距離最近的點合并到同一個類。然后,再 計算類與類之間的距離&#xff0…

通配符 或 怎么濃_濃咖啡的咖啡渣新鮮度

通配符 或 怎么濃How long could you wait to brew espresso after grinding? Ask a barista, any barista, and I suspect their answer is immediately or within a few minutes. The common knowledge on coffee grounds freshness is that after 30 minutes or so, coffee…

保留

看見 你在我眼前 不去猜想我們隔多遠 當我 夜幕中準備 只想讓沉默的能開解 在不同的遭遇里 我發現你的瞬間 有種不可言說的溫柔直覺 在有限的深夜消失之前 觸摸你的臉 我情愿這是幻覺 也不愿是種告別 已經忘了 你的名字 就在這座 寂靜星石 怎么還有 你的樣子 被保留 給我 一整個…

《netty入門與實戰》筆記-02:服務端啟動流程

為什么80%的碼農都做不了架構師?>>> 1.服務端啟動流程 這一小節,我們來學習一下如何使用 Netty 來啟動一個服務端應用程序,以下是服務端啟動的一個非常精簡的 Demo: NettyServer.java public class NettyServer {public static v…

譜聚類思想及實現

(這個我也沒有怎么懂,為了防止以后能用上,還是記錄下來) 譜聚類 注意:譜聚類核心聚類算法還是K-means 算法進行聚類~ 譜聚類的實現過程: 1.根據數據構造一個 圖結構(Graph) &…

Tengine HTTPS原理解析、實踐與調試【轉】

本文邀請阿里云CDN HTTPS技術專家金九,分享Tengine的一些HTTPS實踐經驗。內容主要有四個方面:HTTPS趨勢、HTTPS基礎、HTTPS實踐、HTTPS調試。 一、HTTPS趨勢 這一章節主要介紹近幾年和未來HTTPS的趨勢,包括兩大瀏覽器chrome和firefox對HTTPS的…

Linux 指定運行時動態庫路徑【轉】

轉自:http://www.cnblogs.com/cute/archive/2011/02/24/1963957.html 眾所周知, Linux 動態庫的默認搜索路徑是 /lib 和 /usr/lib 。動態庫被創建后,一般都復制到這兩個目錄中。當程序執行時需要某動態庫, 并且該動態庫還未加載到…

opencv:SIFT——尺度不變特征變換

SIFT概念: Sift(尺度不變特征變換),全稱是Scale Invariant Feature Transform Sift提取圖像的局部特征,在尺度空間尋找極值點,并提取出其位置、尺度、方向信息。 Sfit的應用范圍包括 物體辨別、機器人地圖…

pca(主成分分析技術)_主成分分析技巧

pca(主成分分析技術)介紹 (Introduction) Principal Component Analysis (PCA) is an unsupervised technique for dimensionality reduction.主成分分析(PCA)是一種無監督的降維技術。 What is dimensionality reduction?什么是降維? Let us start with an exam…

npm link run npm script

npm link & run npm script https://blog.csdn.net/juhaotian/article/details/78672390 npm link命令可以將一個任意位置的npm包鏈接到全局執行環境,從而在任意位置使用命令行都可以直接運行該npm包。 app-cmd.cmd #!/usr/bin/env nodeecho "666" &a…

一文詳解java中對JVM的深度解析、調優工具、垃圾回收

2019獨角獸企業重金招聘Python工程師標準>>> jvm監控分析工具一般分為兩類,一種是jdk自帶的工具,一種是第三方的分析工具。jdk自帶工具一般在jdk bin目錄下面,以exe的形式直接點擊就可以使用,其中包含分析工具已經很強…

借用繼承_博物館正在數字化,并在此過程中從數據中借用

借用繼承Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. More importantly, it’s a fun way to connect things we love — visualizing data and kicking up our fee…

高斯噪聲,椒鹽噪聲的思想及多種噪聲的實現

圖像噪聲: 概念: ? 圖像噪聲是圖像在獲取或是傳輸過程中受到隨機信號干擾,妨礙人們對圖像理解及分析處理 的信號。 ? 很多時候將圖像噪聲看做多維隨機過程,因而描述噪聲的方法完全可以借用隨機過程的描述, 也就是使…

bzoj1095 [ZJOI2007]Hide 捉迷藏

據說是道很厲害的題。。。。黃學長的安利啊。。。。 然而我卻用它學分治。。。。 一個坑就擺在這里了。。。。 轉載于:https://www.cnblogs.com/LLppdd/p/9124394.html

如何識別媒體偏見_描述性語言理解,以識別文本中的潛在偏見

如何識別媒體偏見TGumGum can do to bring change by utilizing our Natural Language Processing technology to shed light on potential bias that websites may have in their content. The ideas and techniques shared in this blog are a result of the GumGum Hackatho…

分享 : 警惕MySQL運維陷阱:基于MyCat的偽分布式架構

分布式數據庫已經進入了全面快速發展階段。這種發展是與時俱進的,與人的需求分不開,因為現在信息時代的高速發展,導致數據量和交易量越來越大。這種現象首先導致的就是存儲瓶頸,因為MySQL數據庫實質上還是一個單機版本的數據庫&am…

opencv:圖像讀取BGR變成RGB

opencv大坑之BGR opencv對于讀進來的圖片的通道排列是BGR,而不是主流的RGB!謹記! #opencv讀入的矩陣是BGR,如果想轉為RGB,可以這么轉 img cv2.imread(1.jpg) img cv2.cvtColor(img4,cv2.COLOR_BGR2RGB)