opencv進階08-K 均值聚類cv2.kmeans()介紹及示例

K均值聚類是一種常用的無監督學習算法,用于將一組數據點分成不同的簇(clusters),以便數據點在同一簇內更相似,而不同簇之間差異較大。K均值聚類的目標是通過最小化數據點與所屬簇中心之間的距離來形成簇。

當我們要預測的是一個離散值時,做的工作就是“分類”。例如,要預測一個孩子能否成為優秀的運動員,其實就是要將他分到“好苗子”(能成為優秀的運動員)或“普通孩子”(不能成為優秀運動員)的類別。當我們要預測的是一個連續值時,做的工作就是“回歸”。

例如,預測一個孩子將來成為運動員的指數,計算得到的是 0.99 或者 0.36 之類的數值。機器學習模型還可以將訓練集中的數據劃分為若干個組,每個組被稱為一個“簇(cluster)”。

這些自動形成的簇,可能對應著不同的潛在概念,例如“籃球苗子”、“長跑苗子”。這種學習方式被稱為“聚類(clusting)”,它的重要特點是在學習過程中不需要用標簽對訓練樣本進行標注。也就是說,學習過程能夠根據現有訓練集自動完成分類(聚類)。

根據訓練數據是否有標簽,我們可以將學習劃分為監督學習和無監督學習。

前面介紹的 K近鄰、支持向量機都是監督學習,提供有標簽的數據給算法學習,然后對數據分類。而聚類是無監督學習,事先并不知道分類標簽是什么,直接對數據分類。

舉一個簡單的例子,有 100 粒豆子,如果已知其中 40 粒為綠豆,40 粒為大豆,根據上述標簽,將剩下的 20 粒豆子劃分為綠豆和大豆則是監督學習。

針對上述問題可以使用 K 近鄰算法,計算當前待分類豆子的大小,并找出距離其最近的 5 粒豆子的大小,判斷這 5 粒豆子中哪種豆子最多,將當前豆子判定為數量最多的那一類豆子類別。

同樣,有 100 粒豆子,我們僅僅知道這些豆子里有兩個不同的品種,但并不知道到底是什么品種。此時,可以根據豆子的大小、顏色屬性,或者根據大小和顏色的組合屬性,將其劃分為兩個類型。在此過程中,我們沒有使用已知標簽,也同樣完成了分類,此時的分類是一種無監督學習。

聚類是一種無監督學習,它能夠將具有相似屬性的對象劃分到同一個集合(簇)中。聚類方法能夠應用于所有對象,簇內的對象越相似,聚類算法的效果越好。

理論基礎

本節首先用一個實例來介紹 K 均值聚類的基本原理,在此基礎上介紹 K 均值聚類的基本步驟,最后介紹一個二維空間下的 K 均值聚類示例。

分豆子

假設有 6 粒豆子混在一起,我們可以在不知道這些豆子類別的情況下,將它們按照直徑大小劃分為兩類。

經過測量,以 mm(毫米)為單位,這些豆子的直徑大小分別為 1、2、3、10、20、30。下面將它們標記為 A、B、C、D、E、F,并進行分類操作。

第 1 步:隨機選取兩粒參考豆子。例如,隨機將直徑為 1mm 的豆子 A 和直徑為 2 mm 的豆子 B 作為分類參考豆子。

第 2 步:計算每粒豆子的直徑距離豆子 A 和豆子 B 的距離。距離哪個豆子更近,就將新豆子劃分在哪個豆子所在的組。使用直徑作為距離計算依據時,計算結果如表 22-1 所示。

在這里插入圖片描述
在本步驟結束時,6 粒豆子被劃分為以下兩組。

  • 第 1 組:只有豆子 A。
  • 第 2 組:豆子 B、C、D、E、F,共 5 粒豆子。

第 3 步:分別計算第 1 組豆子和第 2 組豆子的直徑平均值。然后,將各個豆子按照與直徑
平均值的距離大小分組。

  • 計算第 1 組豆子的平均值 AV1 = 1mm。
  • 計算第 2 組豆子的平均值 AV2 = (2+3+10+20+30)/5 = 13mm。

得到上述平均值以后,對所有的豆子再次分組:

  • 將平均值 AV1 所在的組,標記為 AV1 組。
  • 將平均值 AV2 所在的組,標記為 AV2 組。

計算各粒豆子距離平均值 AV1 和 AV2 的距離,并確定分組,如表 22-2 所示。

在這里插入圖片描述
距離平均值 AV1 更近的豆子,就被劃分為 AV1 組;距離平均值 AV2 更近的豆子,就被劃分為 AV2 組。現在,6 粒豆子的分組情況為:

  • AV1 組:豆子 A、豆子 B、豆子 C。
  • AV2 組:豆子 D、豆子 E、豆子 F。

第4 步:重復第 3 步,直到分組穩定不再發生變化,即可認為分組完成。
在本例中,重新計算 AV1 組的平均值 AV41、AV2 組的平均值 AV42,依次計算每個豆子與平均值 AV41 和 AV42 的距離,并根據該距離重新劃分分組。按照與第 3 步相同的方法,重新計算平均值并分組后,6 粒豆子的分組情況為:

  • AV41 組:豆子 A、豆子 B、豆子 C。
  • AV42 組:豆子 D、豆子 E、豆子 F。

與上一次的分組相比,并未發生變化,我們就認為分組完成了
我們將直徑較小的那一組稱為“小豆子”,直徑較大的那一組稱為“大豆子”。

當然,本例是比較極端的例子,數據很快就實現了收斂,在實際處理中可能需要進行多輪的迭代才能實現數據的收斂,分類不再發生變化。

K 均值聚類函數

OpenCV 提供了函數 cv2.kmeans()來實現 K 均值聚類。該函數的語法格式為:

retval, bestLabels, centers=cv2.kmeans(data, K, bestLabels, criteria,
attempts, flags)

式中各個參數的含義為:

  • data:輸入的待處理數據集合,應該是 np.float32 類型,每個特征放在單獨的一列中。

  • K:要分出的簇的個數,即分類的數目,最常見的是 K=2,表示二分類。

  • bestLabels:表示計算之后各個數據點的最終分類標簽(索引)。實際調用時,參數bestLabels 的值設置為 None。

  • criteria:算法迭代的終止條件。當達到最大循環數目或者指定的精度閾值時,算法停止繼續分類迭代計算。該參數由 3 個子參數構成,分別為 type、max_iter 和 eps。
    type 表示終止的類型,可以是三種情況,分別為:

    • cv2.TERM_CRITERIA_EPS:精度滿足 eps 時,停止迭代。
    • cv2.TERM_CRITERIA_MAX_ITER:迭代次數超過閾值 max_iter 時,停止迭代。
    • cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER:上述兩個條件中的
      任意一個滿足時,停止迭代。
  • max_iter:最大迭代次數。

  • eps:精確度的閾值。

  • attempts:在具體實現時,為了獲得最佳分類效果,可能需要使用不同的初始分類值進
    行多次嘗試。指定 attempts 的值,可以讓算法使用不同的初始值進行多次(attempts 次)
    嘗試。

  • flags:表示選擇初始中心點的方法,主要有以下 3 種。

    • cv2.KMEANS_RANDOM_CENTERS:隨機選取中心點。
    • cv2.KMEANS_PP_CENTERS:基于中心化算法選取中心點。
    • cv2.KMEANS_USE_INITIAL_LABELS:使用用戶輸入的數據作為第一次分類中心點;
      如果算法需要嘗試多次(attempts 值大于 1 時),后續嘗試都是使用隨機值或者半隨
      機值作為第一次分類中心點。
      返回值的含義為:
  • retval:距離值(也稱密度值或緊密度),返回每個點到相應中心點距離的平方和。

  • bestLabels:各個數據點的最終分類標簽(索引)。

  • centers:每個分類的中心點數據。

示例:有一堆米粒,按照長度和寬度對它們分類。

為了方便理解,假設米粒有兩種,其中一種是 XM,另外一種是 DM。它們的直徑不一樣,XM 的長和寬都在[0, 20]內,DM 的長和寬都在[40, 60]內。使用隨機數模擬兩種米粒的長度和寬度,并使用函數 cv2.kmeans()對它們分類。
根據題目要求,主要步驟如下:

(1)隨機生成兩組米粒的數據,并將它們轉換為函數 cv2.kmeans()可以處理的形式。
(2)設置函數 cv2.kmeans()的參數形式。
(3)調用函數 cv2.kmeans()。
(4)根據函數 cv2.kmeans()的返回值,確定分類結果。
(5)繪制經過分類的數據及中心點,觀察分類結果。

代碼如下:

import numpy as np
import cv2
from matplotlib import pyplot as plt
# 隨機生成兩組數值
# xiaomi ,長和寬都在[0,20]
xiaomi = np.random.randint(0,20,(30,2))
#dami ,長和寬的大小都在[40,60]dami = np.random.randint(40,60,(30,2))
# 組合數據
MI = np.vstack((xiaomi,dami))
# 轉換為 float32 類型
MI = np.float32(MI)
# 調用 kmeans 模塊
# 設置參數 criteria 值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
# 調用 kmeans 函數
ret,label,center=cv2.kmeans(MI,2,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
'''
#打印返回值
print(ret)
print(label)
print(center)
'''
# 根據 kmeans 的處理結果,將數據分類,分為 XM 和 DM 兩大類
XM = MI[label.ravel()==0]
DM = MI[label.ravel()==1]
# 繪制分類結果數據及中心點
plt.scatter(XM[:,0],XM[:,1],c = 'g', marker = 's')
plt.scatter(DM[:,0],DM[:,1],c = 'r', marker = 'o')
plt.scatter(center[0,0],center[0,1],s = 200,c = 'b', marker = 'o')
plt.scatter(center[1,0],center[1,1],s = 200,c = 'b', marker = 's')
plt.xlabel('Height'),plt.ylabel('Width')
plt.show()

在這里插入圖片描述
右上方的小方塊是標簽為“0”的數據點,左下方的圓點是標簽為“1”的
數據點。右上方稍大的圓點是標簽“0”的數據組的中心點;左下方稍大的方塊是標簽為“1”的數據組的中心點。

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

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

相關文章

opencv實現以圖搜圖

這里寫目錄標題 1. 步驟1.1 導入OpenCV庫:1.2 加載圖像1.3 提取特征1.4 匹配特征1.5 顯示結果 2. 完整代碼3. 測試圖片及效果 1. 步驟 1.1 導入OpenCV庫: 在您的C代碼中,首先需要導入OpenCV庫。您可以使用以下語句導入核心模塊:…

人工智能算法-SVM, KNN

目錄 SVM, KNN區別 一、KNN算法概述 算法的描述: 二、關于K的取值 K的取法: 三、關于距離的選取 Euclidean Distance 定義: 四、總結 SVM, KNN區別

化繁為簡,使用Hibernate Validator實現參數校驗

前言 在之前的悅享校園的開發中使用了SSM框架,由于當時并沒有使用參數參數校驗工具,方法的入參判斷使用了大量的if else語句,代碼十分臃腫,因此最近在重構代碼時,將框架改為SpringBoot后,引入了Hibernate V…

有一種新型病毒在 3Ds Max 環境中傳播,如何避免?

3ds Max渲染慢,可以使用渲云渲染農場: 渲云渲染農場解決本地渲染慢、電腦配置不足、緊急項目渲染等問題,可批量渲染,批量出結果,速度快,效率高。 此外3dmax支持的CG MAGIC插件專業版正式上線,…

機器學習筆記(1):機器學習入門的概念

導航 一、 人工智能,機器學習,深度學習和傳統學習二、數學基礎三、編程語言 如果你剛剛入門機器學習,會接觸到了非常多的概念。比如人工智能,機器學習,深度學習,神機網絡,強化學習,各…

0基礎學習VR全景平臺篇 第85篇:智慧眼-如何分配角色的權限?

一、功能說明 角色權限,是指給智慧眼的所有角色成員分配具體的操作權限。 二、后臺編輯界面 1、點擊“添加權限”,選擇其可操作的“權限”。注意權限只能逐項選擇,所以如果某個角色擁有多項權限的話,那么需要進行多次添加。“快…

uniapp app 實現右上角回首頁;點homeButton返回上一頁;onNavigationBarButtonTap不生效問題

場景: app,Android移動端 實現點擊右上角圖標,回首頁。 問題:用了官網的 homeButton,圖標正常展示了,也可點擊,但每次點擊后是會返回上一頁而非首頁。 后來查到說,要結合onNavigatio…

linux兩臺服務器互相備份文件(sshpass + crontab)

crontab crontab是linux系統自帶的定時調度軟件,可用于設置周期性被執行的指令,一般用在每天的非高峰負荷時間段運行作業,可在無需人工干預的情況下運行作業。支持在一周或一月中的不同時段運行。 crontab命令允許用戶提交、編輯或刪除相應的…

滴滴Ceph分布式存儲系統優化之鎖優化

摘自:https://mp.weixin.qq.com/s/oWujGOLLGItu1Bv5AuO0-A 2020-09-02 21:45 0.引言 Ceph是國際知名的開源分布式存儲系統,在工業界和學術界都有著重要的影響。Ceph的架構和算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat…

Transformers架構系列---transformers庫的使用

Transformers最初是由Google發布的論文 Attention is All You Need (2017) 提出的一種新的深度學習網絡架構,這篇論文證明了序列模型(如 LSTM)可以完全被注意力機制取代,甚至可以獲得更好的性能。Transformers網絡結構自2017年提出之后僅僅一兩年的時間內就一直在NLP領域及…

Vue:使用Promise.all()方法并行執行多個請求

在Vue中,可以使用Promise.all()方法來并行執行多個請求。當需要同時執行多個異步請求時,可以將這些請求封裝為Promise對象并使用Promise.all()方法來執行它們。 示例1: 以下是一個示例代碼,展示了如何通過Promise.all()方法并行…

C語言——動態內存管理

動態內存管理詳解 前言:一、為什么存在動態內存分配二、動態內存函數2.1malloc函數2.2calloc函數2.3realloc函數2.4free函數 三、常見的動態內存錯誤3.1 對NULL指針解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放動態開辟…

Unity UI內存泄漏優化

項目一運行,占用的內存越來越多,不會釋放,導致GC越來越頻繁,越來越慢,這些都是為什么呢,今天從UI方面談起。 首先讓我們來聊聊什么是內存泄漏呢? 一般來講內存泄漏就是指我們的應用向內存申請…

Rabbitmq消息不丟失

目錄 一、消息不丟失1.消息確認2.消息確認業務封裝2.1 發送確認消息測試2.2 消息發送失敗,設置重發機制 一、消息不丟失 消息的不丟失,在MQ角度考慮,一般有三種途徑: 1,生產者不丟數據 2,MQ服務器不丟數據…

設計HTML5列表和超鏈接

在網頁中,大部分信息都是列表結構,如菜單欄、圖文列表、分類導航、新聞列表、欄目列表等。HTML5定義了一套列表標簽,通過列表結構實現對網頁信息的合理排版。另外,網頁中還包含大量超鏈接,通過它實現網頁、位置的跳轉&…

C語言“牽手”微店商品詳情數據方法,微店商品詳情API接口申請指南

微店平臺的商品詳情通常包括以下信息: 商品名稱:展示商品的名稱,用于描述商品的特性和分類。 商品圖片:展示商品的圖片,可以有多張圖片以展示不同角度和細節。 商品價格:顯示商品的銷售價格,可…

nodejs服務后臺持續運行三種方法

nodejs服務后臺持續運行三種方法 一、利用 forever 推薦 forever是一個nodejs守護進程,完全由命令行操控。forever會監控nodejs服務,并在服務掛掉后進行重啟。 1、安裝 forever npm install forever -g 2、啟動服務 service forever start 3、使用…

小程序CSS button按鈕自定義高度之后不居中

問題&#xff1a; 按鈕設置高度后不居中 <view><button class"btn1" size"">Save</button> </view> page {font-size: 30rpx; }.btn1 {margin-top: 100rpx;height: 190rpx;background: linear-gradient(90deg, #FF8A06, #FF571…

Wi-Fi 安全在學校中的重要性

Wi-Fi 是教育機構的基礎設施&#xff0c;從在線家庭作業門戶到虛擬教師會議&#xff0c;應有盡有。大多數 K-12 管理員對自己的 Wi-Fi 網絡的安全性充滿信心&#xff0c;并認為他們現有的網絡安全措施已經足夠。 不幸的是&#xff0c;這種信心往往是錯誤的。Wi-Fi 安全雖然經常…