日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

聚类(Clustering): K-means算法

發(fā)布時(shí)間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聚类(Clustering): K-means算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

聚類(Clustering): K-means算法

1.歸類:
聚類(clustering)屬于非監(jiān)督學(xué)習(xí)(unsupervised learning)
無(wú)類別標(biāo)記( class label)

3. K-means 算法:
3.1 Clustering 中的經(jīng)典算法,數(shù)據(jù)挖掘十大經(jīng)典算法之一
3.2 算法接受參數(shù) k ;然后將事先輸入的n個(gè)數(shù)據(jù)對(duì)象劃分為 k個(gè)聚類以便使得所獲得的聚類滿足:同一聚類中的對(duì)象相似度較高;而不同聚類中的對(duì)象相似度較小。(k表示數(shù)據(jù)要分的類別的數(shù)量,比如上圖分為三種類型,則k=3)

3.3 算法思想:以空間中k個(gè)點(diǎn)為中心進(jìn)行聚類,對(duì)最靠近他們的對(duì)象歸類。通過(guò)迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結(jié)果3.4 算法描述:(1)適當(dāng)選擇c個(gè)類的初始中心;(2)在第k次迭代中,對(duì)任意一個(gè)樣本,求其到c各中心的距離,將該樣本歸到距離最短的中心所在的類;(3)利用均值等方法更新該類的中心值;(4)對(duì)于所有的c個(gè)聚類中心,如果利用(2)(3)的迭代法更新后,值保持不變(停止時(shí)機(jī))/或達(dá)到預(yù)定的次數(shù)/分類變化小于預(yù)定值,則迭代結(jié)束,否則繼續(xù)迭代。

3.5 算法流程:

輸入:k, data[n];( k:分的類別數(shù),data[n]:樣本數(shù)據(jù))(1) 選擇k個(gè)初始中心點(diǎn),例如c[0]=data[0],…c[k-1]=data[k-1];(通常用random隨機(jī)挑選初始中心點(diǎn))(2) 對(duì)于data[0]….data[n], 分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標(biāo)記為i;(3) 對(duì)于所有標(biāo)記為i點(diǎn),重新計(jì)算c[i]={ 所有標(biāo)記為i的data[j]之和}/標(biāo)記為i的個(gè)數(shù);(4) 重復(fù)(2)(3),直到所有c[i]值的變化小于給定閾值。

Euclidean Distance歐幾里得距離即求向量之間的距離
概括:1.(隨機(jī))定義三個(gè)中心點(diǎn).2.找最近的點(diǎn)3.用均值定義新的中心點(diǎn).4.繼續(xù)23步直到中心點(diǎn)保持不變/達(dá)到預(yù)定的次數(shù)/分類變化小于預(yù)定值

4.流程圖:

示例:


用矩陣計(jì)算距離:(不用Euclidean Distance方式計(jì)算)

上標(biāo)0表示第0次迭代,上面一行4個(gè)值分別表示與(1,1)的距離值

上下兩排中,1表示對(duì)應(yīng)位置的該點(diǎn)歸為當(dāng)前相同類,0則表示歸為不同類
Group1的中心點(diǎn)不變(因?yàn)橹挥蠥一個(gè)點(diǎn))
Group2的中心點(diǎn)為:(求均值)

重新劃分類別:

此時(shí)B點(diǎn)被分類為group1:

再分類:

此時(shí),分類相比上次已經(jīng)沒(méi)有變化了:

所以迭代停止

聚類算法優(yōu)缺點(diǎn):
優(yōu)點(diǎn):速度快,簡(jiǎn)單
缺點(diǎn):最終結(jié)果跟初始點(diǎn)選擇相關(guān)度很大,容易陷入局部最優(yōu),需直到k值

聚類(Clustering): K-means算法應(yīng)用

Python中code實(shí)例應(yīng)用:

import numpy as np# Function: K Means # ------------- # K-Means is an algorithm that takes in a dataset and a constant # k and returns k centroids (which define clusters of data in the # dataset which are similar to one another).def kmeans(X,k,maxIt): '''X:數(shù)據(jù)集;k:分類個(gè)數(shù);maxIt:設(shè)置的循環(huán)次數(shù)'''numPoints,numDim = X.shape #X(類型為numpy array),行數(shù)(也可以叫做點(diǎn)數(shù))和列數(shù)(維度)dataSet = np.zeros((numPoints,numDim+1)) #注意這里有兩組括號(hào)dataSet[:, :-1] = X #dataset中除了最后一列的值都用X的值替代'''array中直接使用等號(hào)這種賦值方法(“=”),必須兩者維度相同,所以這里把最后一列除開(kāi)在外,使兩者維度相同'''# Initialize centroids randomly#隨機(jī)生成初始中心點(diǎn)centroids = dataSet[np.random.randint(numPoints,size=k),:] #需要從所有行中選取k組作為中心點(diǎn)# centroids =dataSet[0:2,:] ##表示自行選取前兩個(gè)axis中兩組點(diǎn)作為中心點(diǎn),用來(lái)核算算法是否準(zhǔn)確#Randomly assign labels to initial centoridcentroids[:,-1] = range(1,k+1) #將中心點(diǎn)分類為1,2,k~等若干類# Initialize book keeping vars. 記賬:迭代次數(shù)iterations = 0oldCentroids = None #每一次迭代完新的中心點(diǎn)就要變成舊的中心點(diǎn),后面用 # Run the main k-means algorithm # 停止函數(shù)中的參數(shù): # oldCentroids: 舊的中心點(diǎn) # centroids:新的中心點(diǎn),可以設(shè)置新舊相等時(shí)停止 # iterations: 記錄循環(huán)多少次,可以用來(lái)設(shè)置到指定循環(huán)次數(shù)停止 # maxIt:循序循環(huán)的最大次數(shù)while not shouldStop(oldCentroids,centroids,iterations,maxIt):print('iterations:\n',iterations)print('dataSet:\n',dataSet)print('centroids:\n',centroids)# Save old centroids for convergence test. Book keepingoldCentroids = np.copy(centroids) #將新中心點(diǎn)變?yōu)榫椭行狞c(diǎn),并且保留舊中心點(diǎn)的值,**使用np.copy**iterations += 1# Assign labels to each datapoint based on centroidsupdateLabels(dataSet,centroids) #調(diào)用更新label的函數(shù)centroids = getCentroids(dataSet,k) #獲取中心點(diǎn)用于判斷是否結(jié)束# We can also get the labels by calling getLabels(dataSet, centroids)return dataSet# Function: Should Stop # ------------- # Returns True or False if k-means is done. K-means terminates either # because it has run a maximum number of iterations OR the centroids stop changing. # 終止條件:迭代次數(shù)到達(dá)指定次數(shù);或中心點(diǎn)不再變化 def shouldStop(oldCentroids,centroids,iterations,maxIt):if iterations>maxIt:return Truereturn np.array_equal(oldCentroids,centroids) #**使用np.array_equal判斷兩數(shù)組值是否相等**判斷類型相同則用?def updateLabels(dataSet,centroids): #距離中心點(diǎn)最短則與中心點(diǎn)歸為一類,歸類的具體方法后面單獨(dú)封包了函數(shù)numPoints,numDim = dataSet.shapefor i in range(numPoints):dataSet[i,-1] = getLabelFromClosestCentroids(dataSet[i,:-1],centroids)#需要參數(shù):中心點(diǎn)和每一行的特征值#歸類方法比較復(fù)雜,單獨(dú)封包一個(gè)函數(shù)def getLabelFromClosestCentroids(dataRow,centroids): # dataSetRow:一行一個(gè)實(shí)例。中心點(diǎn)(K行,列數(shù)相同的矩陣) label = centroids[0,-1] #第0個(gè)[]中的的倒數(shù)第一個(gè)值賦值給labelminDist = np.linalg.norm(dataRow - centroids[0,:-1]) #第一個(gè)距離就是最小值,dataRow?'''np.linalg.norm(X-Y):sqrt((x1-y1)^2+(x2-y2)^2),X=np.array([x1,x2]),Y=np.array([y1,y2]);可以理解為歐幾里得distance求向量的距離'''#linalg=linear(線性)+algebra(代數(shù)),norm則表示范數(shù)for i in range(1,centroids.shape[0]+1): #+1?dist = np.linalg.norm(dataRow-centroids[i,:-1])if dist < minDist:minDist = distlabel = centroids[i,-1]print('minDist:',minDist)return label # Function: Get Centroids # ------------- # Returns k random centroids, each of dimension n. def getCentroids(dataSet,k):result = np.zeros((k,dataSet.shape[1])) #兩對(duì)括號(hào) 不然會(huì)報(bào)錯(cuò) TypeError: data type not understoodfor i in range(1,k+1):oneCluster = dataSet[dataSet[:,-1]==i,:-1] #對(duì)于dataset每一行如果dataset最后一個(gè)值(即label)=i,則把它的特征值X賦值給oneCluster組成一個(gè)數(shù)組array'''相當(dāng)于嵌套了一個(gè)if dataSet[:-1]==i語(yǔ)句'''# np.meamn,axis=0對(duì)array的行求均值,axis=1對(duì)array的列求均值result[i-1,:-1] = np.mean(oneCluster,axis=0) #求均值找中心點(diǎn),result即新的中心點(diǎn)result[i-1,-1] = i #Label分類為ireturn resultx1 = np.array([1,1]) x2 = np.array([2,1]) x3 = np.array([4,3]) x4 = np.array([5,4])testX = np.vstack((x1,x2,x3,x4)) #按垂直方向堆疊構(gòu)成一個(gè)新的數(shù)組,注意兩對(duì)括號(hào)result = kmeans(testX,2,10) print('final result:\n',result)#sklearn 中也可以調(diào)用kmeans算法

總結(jié)

以上是生活随笔為你收集整理的聚类(Clustering): K-means算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。