国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

聚類分析: k-means算法

2024-07-21 02:51:39
字體:
來源:轉載
供稿:網友

k-means算法

聚類分析是數(shù)據分析中,非常重要的一類課題。他的作用是將大量的無標簽數(shù)據通過計算,自動為其標注標簽。眾所周知,這一點是區(qū)別于數(shù)據分類技術的。而現(xiàn)實的場景中,無標簽的數(shù)據顯然多于有標簽數(shù)據,因此,我在這里也是先說聚類,后面的博文,再說分類。

聚類的目的,是要將數(shù)據歸為不同的類,基本原則是要相近的數(shù)據盡量歸為一類,而不同類之間的數(shù)據則要盡量有比較大的差別。

說到聚類,當然最先想到的就是k-means算法。它不僅是最簡單的聚類算法,也是最普及且最常用的。k-means算法是一種基于形心的劃分數(shù)據的方法。我們給定一個數(shù)據集D,以及要劃分的簇數(shù)k,就能通過該算法將數(shù)據集劃分為k個簇。一般來說,每個數(shù)據項只能屬于其中一個簇。具體方法可以這樣描述:

假設數(shù)據集在一個m維的歐式空間中,我們初始時,可隨機選擇k個數(shù)據項作為這k個簇的形心Ci,i∈{1,2,…k},每個簇心代表的其實是一個簇,也就是一組數(shù)據項構成的集合。然后對所有的n個數(shù)據項,計算這些數(shù)據項與Ci的距離(一般情況下,在歐式空間中,數(shù)據項之間的距離用歐式距離表示)。比如對于數(shù)據項Dj,j∈{1,…n},它與其中的一個簇心Ci最近,則將Dj歸類為簇Ci.通過上面這一步,我們就初步將D劃分為k個類了。現(xiàn)在重新計算這k個類的形心。方法是計算類中所有數(shù)據項的各個維度的均值。這樣,構成一個新的形心,并且更新這個類的形心。每個類都這樣計算一次,更新形心。對上一步計算得到的新的形心,重復進行第(1),(2)步的工作,直到各個類的形心不再變化為止。

下面,通過一個例子,展示k-means的細節(jié)。

我們來處理一個簡單的二維平面上的聚類問題。數(shù)據集為:A1(2, 10), A2(2, 5), A3(8, 4), B1(5, 8), B2(7, 5), B3(6, 4), C1(1, 2), C2(4,9),如圖Fig.1:

現(xiàn)在,我們選擇:A1, B1, C1三個點作為初始的簇心,將這個數(shù)據集分成三類。

第一步,令所有數(shù)據點選擇距離他們最近的簇心,并且執(zhí)行歸類:歸類的結果如圖Fig.1中虛線所圈出來的那樣:

第二步,更新簇心,重新計算距離,再次執(zhí)行歸類,結果如圖Fig.2所示,圖中,我用紅色*號表示簇心:

第三步,重復進行前兩步,直到簇心不在變更為止,最終,得到Fig.3中所示的聚類結果,圖中,我用紅色*號表示簇心:

可見,整個算法就是一個迭代的過程。需要注意的是,初始簇心的選擇有時候會影響最終的聚類結果,所以,實際操作中,我們一般會選用不同的數(shù)據作為初始簇心,多次執(zhí)行k-means算法。

由于篇幅限制,詳細的實現(xiàn)代碼我在我的github主頁中給出:kmeans,這里省略。

最后,我們對k-means算法作簡要分析:

時間復雜度:O(nkt),其中,n為數(shù)據項個數(shù),k為要聚類成的簇數(shù),t為迭代次數(shù)。而通常,k<<n,所以,對于大數(shù)據集,k-means算法相對可伸縮,且有效。局限性:k-means算法有其相應的局限性,我們必須明白這些缺點,才能避免不正確的使用: 只能應用于可計算均值的數(shù)據,比如對于一些標稱屬性的數(shù)據,就不能使用k-means。所以,后來人們設計了k-眾數(shù)算法,來解決對于標稱屬性數(shù)據的聚類;必須事先給出要生成的簇數(shù)k,而實際上我們大多時候并不知道這些數(shù)據應該生成的簇數(shù),后來ISODATA算法通過類的自動合并和分裂,得到較為合理的類型數(shù)目k;前面已經說過,k-means對于初始點的選擇很重要,不同初始點,會導致不同效果的聚類。為了解決這個問題,k-means++算法應運而生。

k-means++算法

k-means++是k-means的變形,通過小心選擇初始簇心,來獲得較快的收斂速度以及聚類結果的質量,本文中,我們將簡單介紹k-means++. 首先,一定要先理解k-means++的原理。

它是這樣去做的:先隨機選擇一個數(shù)據項作為第一個初始的簇心(當然,最終我們要選擇k個),根據這1個簇心,我們通過一系列計算,獲得第2個簇心,再根據這2個簇心,通過計算獲得第3個簇心。。。以此類推,最終,獲得全部的k個簇心,然后,再按照上面k-means的做法,做聚類分析。其中,至于下一個簇心的選擇需要經過怎樣的計算,我們放到后面再說?,F(xiàn)在需要明白的是,通過增加合理計算的方式,我們不再是隨機選取k個簇心作為初始值,而是通過一種迭代算法,合理選擇簇心。

那么究竟怎樣的選擇就是合理的選擇呢?在此我們有這樣一個原則:假設現(xiàn)在已經選擇了r個簇心,要接著選取第r+1個簇心。那么當然是應該選擇距離其簇心較遠的數(shù)據點當新的簇心??梢阅X補這樣一個場景:r個簇心,每個數(shù)據點都對應著且只對應著一個簇心,這個簇心當然是相對于其他r?1個簇心來說,是距離這個數(shù)據點最近的。于是每個點,都與其簇心有條連線,連線的長度就是這個數(shù)據點到簇心的距離,我們現(xiàn)在要做的,就是選擇距離其簇心距離較大的那個數(shù)據點。

你可能會說,這個道理很簡單,但是應該是選擇距離“最大”的才對,為什么選擇距離“較大”的呢?那是因為這里面可能會存在數(shù)據噪聲的問題,也可能由于我們至少第一個簇心的選擇還是隨機的緣故,導致如果這樣每次都“精確”選擇,反而最終的聚類效果不佳。所以,一種比較合理的做法是選擇“較大”,而非“最大”。當然,從這一點,我們也能看出,k-means++即使比傳統(tǒng)的k-means更好,卻依然是一種啟發(fā)式的算法,不能說這種做法最終的結果就一定是最優(yōu)的。

現(xiàn)在的問題就全部集中在如何選擇離簇心距離“較大”的數(shù)據點了。假設,現(xiàn)在將所有的數(shù)據點與其對應簇心連接,那么會構成n條連線(n是數(shù)據項的個數(shù),自己與自己連接的情況,可以看做是構成了一條長度為0的線),我們記這n條連線的長度為Dis1,Dis2,…Disn,然后把這n條連線按隨機的順序,首尾相連,構成一條長度為∑Disi的連線,然后現(xiàn)在隨機拋出一點,落在這條“總線”上,那么顯然,落在距離較長的線上的概率更高一些,如Fig.4所示,假設D1,D2,D3距離其對應簇心的長度分別是1, 2, 3,那當然是落在Dis3上的概率最高了。選擇下一簇心的具體方法操作如下:

對已經選出作為簇心的r個點(r<k),計算數(shù)據集中每個數(shù)據項應該歸類的簇,以及距離將這n個距離求和,得到sum(Dis_i),然后隨機選取一個小于sum(Dis_i)的值Random令Random依次減去Disi,Random -= Disi,直到Random <= 0為止,此時,Random減去的Disi所對應的數(shù)據項就是新的簇心。

綜上,k-means++算法步驟如下:

隨機選擇一個數(shù)據項,作為第一個簇心根據選擇下一個簇心的操作方法(上面列出的3步),選擇下一簇心重復步驟2,直到得到全部的k個簇心

k-means++雖然在初始簇心的選擇上比k-means更優(yōu),但是依然也有缺陷,比如,下一個簇心的選擇總是依賴于已有的簇心,后來k-means||算法,改進了這一缺點,這里就不再做過多介紹了。

k-means++算法和前面k-means算法的全部代碼以及測試數(shù)據我都放在了github上:kmeans,歡迎參考指正。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 房产| 隆昌县| 玉山县| 兴安县| 石柱| 贵州省| 东乡族自治县| 绥阳县| 安福县| 中牟县| 兴隆县| 临潭县| 高安市| 重庆市| 九江县| 喀什市| 渭南市| 铁岭市| 罗源县| 红安县| 贵定县| 昂仁县| 灵璧县| 深水埗区| 长治市| 迁安市| 玉林市| 广水市| 内丘县| 平武县| 兴国县| 和顺县| 耒阳市| 宝清县| 汝阳县| 怀宁县| 阳曲县| 伊宁市| 丰顺县| 樟树市| 宽甸|