網(wǎng)站首頁 編程語言 正文
初步認識
k-means翻譯過來就是K均值聚類算法,其目的是將樣本分割為k個簇,而這個k
則是KMeans
中最重要的參數(shù):n_clusters
,默認為8。
下面做一個最簡單的聚類
import numpy as np import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import make_blobs X, y = make_blobs(1500) fig = plt.figure() for i in range(2): ax = fig.add_subplot(1,2,i+1) y = KMeans(i+2).fit_predict(X) plt.scatter(X[:, 0], X[:, 1], c=y) plt.show()
其中,y
是聚類結(jié)果,其數(shù)值表示對應位置X
所屬類號。
效果如圖所示,對于下面這組數(shù)據(jù)來說,顯然最好是分為兩類,但如果KMeans
的n_clusters
設(shè)為3,那就會聚成3類。
上面調(diào)用的KMeans
是一個類,sklearn
中同樣提供了函數(shù)形式的調(diào)用,其使用方法如下
from sklearn.cluster import k_means cen, y, interia = k_means(X, 3)
其中,cen
表示聚類后,每一類的質(zhì)心;y
為聚類后的標簽;interia
表示均方誤差之和。
初值選取
在KMeans
最重要的概念是簇,也就是被分割后的數(shù)據(jù)種類;而每個簇都有一個非常重要的點,就是質(zhì)心。在設(shè)定好簇的個數(shù)之后,也就相當于確定了質(zhì)心的個數(shù),而KMeans
算法的基本流程是
- 選擇k個點作為k個簇的初始質(zhì)心
- 計算樣本到這k個質(zhì)心(簇)的距離,并將其劃入距離最近的簇中
- 計算每個簇的均值,并使用該均值更新簇的質(zhì)心
重復上述2-3的操作,直到質(zhì)心區(qū)域穩(wěn)定或者達到最大迭代次數(shù)。
從這個流程可以看出來,KMeans
算法至少有兩個細節(jié)需要考慮,一個是初始化方案,另一個則是質(zhì)心更新的方案。
在KMeans
類或者k_means
函數(shù)中,提供了兩種初始化質(zhì)心方案,通過參數(shù)init
來控制
-
'random'
:表示隨機生成k個質(zhì)心 -
'k-means++'
:此為默認值,通過kMeans++
方法來初始化質(zhì)心。
kMeans++
初始化質(zhì)心的流程如下
- 隨機選擇1個點作為初始質(zhì)心 x 0
- ?計算其他點到最近質(zhì)心的距離
- 假定現(xiàn)有 n n n個質(zhì)心了,那么選擇距離當前質(zhì)心較遠的點作為下一個質(zhì)心 x n x_n xn?
重復步驟2和3,直到質(zhì)心個數(shù)達到 k k k個。
若希望直接調(diào)用kMeans++
函數(shù),則可使用kmeans_plusplus
。
小批
sklearn
提供了KMeans
的一個變種MiniBatchKMeans
,可在每次訓練迭代中隨機抽樣,這種小批量的訓練過程大大減少了運算時間。
當樣本量非常巨大時,小批KMeans的優(yōu)勢是非常明顯的
from sklearn.cluster import MiniBatchKMeans import time ys, xs = np.indices([4,4])*6 cens = list(zip(xs.reshape(-1), ys.reshape(-1))) X, y = make_blobs(100000,centers=cens) km = KMeans(16) mbk = MiniBatchKMeans(16) def test(func, value): t = time.time() func(value) print("耗時", time.time()-t) test(km.fit_predict, X) # 耗時 3.2028110027313232 test(mbk.fit_predict, X) # 耗時 0.2590029239654541
可見效果非常明顯,其中fit_predict
和predict
相似,但并沒有返回值,km.fit_predict(X)
運行之后,會更改km
中的labels_
屬性,此即分類結(jié)果
fig = plt.figure() ax = fig.add_subplot(1,2,1) ax.scatter(X[:,0], X[:,1], c=km.labels_, marker='.', alpha=0.5) ax = fig.add_subplot(1,2,2) ax.scatter(X[:,0], X[:,1], c=mbk.labels_, marker='.', alpha=0.5) plt.show()
效果如圖所示,可見小批的KMeans算法和KMeans算法從結(jié)果上來看區(qū)別不大。
原文鏈接:https://blog.csdn.net/m0_37816922/article/details/128326778
相關(guān)推薦
- 2022-06-23 C#使用DLLImport調(diào)用外部DLL的方法_C#教程
- 2022-03-20 ajax和fetch的區(qū)別點總結(jié)_AJAX相關(guān)
- 2022-06-15 詳解Python進行數(shù)據(jù)相關(guān)性分析的三種方式_python
- 2022-10-30 詳解Golang如何實現(xiàn)一個環(huán)形緩沖器_Golang
- 2022-12-30 React淺析Fragments使用方法_React
- 2022-11-13 Git如何實現(xiàn)checkout遠程tag_相關(guān)技巧
- 2022-05-14 Python的進程,線程和協(xié)程實例詳解_python
- 2022-08-16 Python利用fastapi實現(xiàn)上傳文件_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支