kmeans算法中的sse_聚类算法入门:k-means
生活随笔
收集整理的這篇文章主要介紹了
kmeans算法中的sse_聚类算法入门:k-means
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、聚類定義
- 聚類分析(cluster analysis)就是給你一堆雜七雜八的樣本數(shù)據(jù)把它們分成幾個(gè)組,組內(nèi)成員有一定的相似,不同組之間成員有一定的差別。
- 區(qū)別與分類分析(classification analysis) 你事先并不知道有哪幾類、劃分每個(gè)類別的標(biāo)準(zhǔn)。
- 比如垃圾分類就是分類算法,你知道豬能吃的是濕垃圾,不能吃的是干垃圾……;打掃房間時(shí)你把雜物都分分類,這是聚類,你事先不知道每個(gè)類別的標(biāo)準(zhǔn)。
二、劃分聚類方法: K-means:
對(duì)于給定的樣本集,按照樣本之間的距離(也就是相似程度)大小,將樣本集劃分為K個(gè)簇(即類別)。讓簇內(nèi)的點(diǎn)盡量緊密的連在一起,而讓簇間的距離盡量的大。
- 步驟1:隨機(jī)取k個(gè)初始中心點(diǎn)
- 步驟2:對(duì)于每個(gè)樣本點(diǎn)計(jì)算到這k個(gè)中心點(diǎn)的距離,將樣本點(diǎn)歸到與之距離最小的那個(gè)中心點(diǎn)的簇。這樣每個(gè)樣本都有自己的簇了
- 步驟3:對(duì)于每個(gè)簇,根據(jù)里面的所有樣本點(diǎn)重新計(jì)算得到一個(gè)新的中心點(diǎn),如果中心點(diǎn)發(fā)生變化回到步驟2,未發(fā)生變化轉(zhuǎn)到步驟4
- 步驟4:得出結(jié)果
就像這樣
缺點(diǎn):
初始值敏感、采用迭代方法,得到的結(jié)果只是局部最優(yōu)、K值的選取不好把握、對(duì)于不是凸的數(shù)據(jù)集比較難收斂
如何衡量Kmeans 算法的精確度?
SSE(Sum of Square Error) 誤差平方和, SSE越小,精確度越高。
三、改進(jìn)算法-二分Kmeans
- 首先將所有點(diǎn)作為一個(gè)簇,然后將其一分為二。
- 每次選擇一個(gè)簇一分為二,選取簇的依據(jù)取決于其是否能最大程度降低SSE即選取聚類后SSE最小的一個(gè)簇進(jìn)行劃分。
- 直至有k個(gè)簇
四、Kmeans Code
import numpy as npimport matplotlib.pyplot as pltimport scipy.io as scio# %matplotlib inlinedef K_Means(X, sp, K): # 計(jì)算臨近點(diǎn) def near(p): dis = [np.sum(np.square(x-p)) for x in sp] return dis.index(min(dis)) # 打印結(jié)果 def print_result(sp_list): #打印中心點(diǎn)迭代軌跡 sp_list = [np.array([x[k] for x in sp_list]) for k in range(K)] for k in range(K): plt.plot(sp_list[k][:,0], sp_list[k][:,1], 'k->', label='type{}'.format(k)) #分類打印其他點(diǎn) p_list = [[] for k in range(K)] for p in X: i = near(p) p_list[i].append(p) p_list = [np.array(x) for x in p_list] color = ['r','g','b'] for i in range(K): plt.plot(p_list[i][:,0], p_list[i][:,1],color[i]+'o') plt.title('K-Means Result') plt.xlabel('X') plt.ylabel('Y') plt.legend('123') plt.show() # 迭代中心點(diǎn) sp_list = [] sp_list.append(sp) while True: count = np.zeros(K) sp_t = np.zeros((K,2)) for p in X: i = near(p) count[i] += 1 sp_t[i] += p sp_t = np.array([sp_t[i]/count[i] for i in range(K)]) SSE = np.sum(np.square(sp-sp_t)) if SSE < 0.001: break sp = sp_t sp_list.append(sp) print_result(sp_list) print('聚類中心:') for p in sp: print(p, end=',')if __name__ == '__main__': data = scio.loadmat('ex7data2.mat') X = data['X'] K = 3 sp = np.array([[3, 3], [6, 2], [8, 5]]) # starting point K_Means(X, sp, K)kmeans聚類結(jié)果
K為3聚類中心: [1.95399466 5.02557006],[3.04367119 1.01541041],[6.03366736 3.00052511]
如需要測(cè)試數(shù)據(jù)請(qǐng)留言
本文由作者授權(quán)轉(zhuǎn)載并稍加修改:https://tawn0000.github.io
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的kmeans算法中的sse_聚类算法入门:k-means的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java读取文件夹_Java读取某个文件
- 下一篇: jvm垃圾回收机制_JVM 垃圾回收机制