❶ K-means 與KNN 聚類演算法
K-means 演算法屬於聚類演算法的一種。聚類演算法就是把相似的對象通過靜態分類方法分成不同的組別或者更多的子集(subset),這樣讓在同一個子集中的成員對象都有相似的一些屬性。聚類演算法的任務是將數據集劃分為多個集群。在相同集群中的數據彼此會比不同集群的數據相似。通常來說,聚類演算法的目標就是通過相似特徵將數據分組並分配進不同的集群中。
K-means 聚類演算法是一種非監督學習演算法,被用於非標簽數據(data without defined categories or groups)。該演算法使用迭代細化來產生最終結果。演算法輸入的是集群的數量 K 和數據集。數據集是每個數據點的一組功能。 演算法從 Κ 質心的初始估計開始,其可以隨機生成或從數據集中隨機選擇 。然後演算法在下面兩個步驟之間迭代:
每個質心定義一個集群。在此步驟中,基於平方歐氏距離將每個數據點分配到其最近的質心。更正式一點, ci 屬於質心集合 C ,然後每個數據點 x 基於下面的公式被分配到一個集群中。
在此步驟中,重新計算質心。這是通過獲取分配給該質心集群的所有數據點的平均值來完成的。公式如下:
K-means 演算法在步驟 1 和步驟 2 之間迭代,直到滿足停止條件(即,沒有數據點改變集群,距離的總和最小化,或者達到一些最大迭代次數)。
上述演算法找到特定預選 K 值和數據集標簽。為了找到數據中的集群數,用戶需要針對一系列 K 值運行 K-means 聚類演算法並比較結果。通常,沒有用於確定 K 的精確值的方法,但是可以使用以下技術獲得准確的估計。
Elbow point 拐點方法
通常用於比較不同 K 值的結果的度量之一是數據點與其聚類質心之間的平均距離。由於增加集群的數量將總是減少到數據點的距離,因此當 K 與數據點的數量相同時,增加 K 將總是減小該度量,達到零的極值。因此,該指標不能用作唯一目標。相反,繪制了作為 K 到質心的平均距離的函數,並且可以使用減小率急劇變化的「拐點」來粗略地確定 K 。
DBI(Davies-Bouldin Index)
DBI 是一種評估度量的聚類演算法的指標,通常用於評估 K-means 演算法中 k 的取值。簡單的理解就是:DBI 是聚類內的距離與聚類外的距離的比值。所以,DBI 的數值越小,表示分散程度越低,聚類效果越好。
還存在許多用於驗證 K 的其他技術,包括交叉驗證,信息標准,信息理論跳躍方法,輪廓方法和 G 均值演算法等等。
需要提前確定 K 的選值或者需嘗試很多 K 的取值
數據必須是數字的,可以通過歐氏距離比較
對特殊數據敏感,很容易受特殊數據影響
對初始選擇的質心/中心(centers)敏感
之前介紹了 KNN (K 鄰近)演算法 ,感覺這兩個演算法的名字很接近,下面做一個簡略對比。
K-means :
聚類演算法
用於非監督學習
使用無標簽數據
需要訓練過程
K-NN :
分類演算法
用於監督學習
使用標簽數據
沒有明顯的訓練過程
鄰近演算法,或者說K最近鄰(kNN,k-NearestNeighbor)分類演算法是數據挖掘分類技術中最簡單的方法之一。所謂K最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。Cover和Hart在1968年提出了最初的鄰近演算法。KNN是一種分類(classification)演算法,它輸入基於實例的學習(instance-based learning),屬於懶惰學習(lazy learning)即KNN沒有顯式的學習過程,也就是說沒有訓練階段,數據集事先已有了分類和特徵值,待收到新樣本後直接進行處理。與急切學習(eager learning)相對應。
KNN是通過測量不同特徵值之間的距離進行分類。
思路是:如果一個樣本在特徵空間中的k個最鄰近的樣本中的大多數屬於某一個類別,則該樣本也劃分為這個類別。KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
提到KNN,網上最常見的就是下面這個圖,可以幫助大家理解。
我們要確定綠點屬於哪個顏色(紅色或者藍色),要做的就是選出距離目標點距離最近的k個點,看這k個點的大多數顏色是什麼顏色。當k取3的時候,我們可以看出距離最近的三個,分別是紅色、紅色、藍色,因此得到目標點為紅色。
演算法的描述:
1)計算測試數據與各個訓練數據之間的距離;
2)按照距離的遞增關系進行排序;
3)選取距離最小的K個點;
4)確定前K個點所在類別的出現頻率;
5)返回前K個點中出現頻率最高的類別作為測試數據的預測分類
二、關於 K 的取值
K:臨近數,即在預測目標點時取幾個臨近的點來預測。
K值得選取非常重要,因為:
如果當K的取值過小時,一旦有雜訊得成分存在們將會對預測產生比較大影響,例如取K值為1時,一旦最近的一個點是雜訊,那麼就會出現偏差,K值的減小就意味著整體模型變得復雜,容易發生過擬合;
如果K的值取的過大時,就相當於用較大鄰域中的訓練實例進行預測,學習的近似誤差會增大。這時與輸入目標點較遠實例也會對預測起作用,使預測發生錯誤。K值的增大就意味著整體的模型變得簡單;
如果K==N的時候,那麼就是取全部的實例,即為取實例中某分類下最多的點,就對預測沒有什麼實際的意義了;
K的取值盡量要取奇數,以保證在計算結果最後會產生一個較多的類別,如果取偶數可能會產生相等的情況,不利於預測。
K的取法:
常用的方法是從k=1開始,使用檢驗集估計分類器的誤差率。重復該過程,每次K增值1,允許增加一個近鄰。選取產生最小誤差率的K。
一般k的取值不超過20,上限是n的開方,隨著數據集的增大,K的值也要增大。
三、關於距離的選取
距離就是平面上兩個點的直線距離
關於距離的度量方法,常用的有:歐幾里得距離、餘弦值(cos), 相關度 (correlation), 曼哈頓距離 (Manhattan distance)或其他。
Euclidean Distance 定義:
兩個點或元組P1=(x1,y1)和P2=(x2,y2)的歐幾里得距離是
距離公式為:(多個維度的時候是多個維度各自求差)
四、總結
KNN演算法是最簡單有效的分類演算法,簡單且容易實現。當訓練數據集很大時,需要大量的存儲空間,而且需要計算待測樣本和訓練數據集中所有樣本的距離,所以非常耗時
KNN對於隨機分布的數據集分類效果較差,對於類內間距小,類間間距大的數據集分類效果好,而且對於邊界不規則的數據效果好於線性分類器。
KNN對於樣本不均衡的數據效果不好,需要進行改進。改進的方法時對k個近鄰數據賦予權重,比如距離測試樣本越近,權重越大。
KNN很耗時,時間復雜度為O(n),一般適用於樣本數較少的數據集,當數據量大時,可以將數據以樹的形式呈現,能提高速度,常用的有kd-tree和ball-tree。
❷ K-Means 聚類演算法
問題導入
假如有這樣一種情況,在一天你想去某個城市旅遊,這個城市裡你想去的有70個地方,現在你只有每一個地方的地址,這個地址列表很長,有70個位置。事先肯定要做好攻略,你要把一些比較接近的地方放在一起組成一組,這樣就可以安排交通工具抵達這些組的「某個地址」,然後步行到每個組內的地址。那麼,如何確定這些組,如何確定這些組的「某個地址」?答案就是聚類。而本文所提供的k-means聚類分析方法就可以用於解決這類問題。
一,聚類思想
所謂聚類演算法是指將一堆沒有標簽的數據自動劃分成幾類的方法,屬於無監督學習方法,這個方法要保證同一類的數據有相似的特徵,如下圖:
根據樣本之間的距離或者說相似性,把越相似,差異越小的樣本聚成一類(簇),最後形成多個簇,使同一個簇內部的樣本相似度高,不同簇之間差異性高。
二,K-Means聚類分析演算法
K-Means是一種基於自下而上的聚類分析方法,基本概念就是空間中有N個點,初始選擇K個點作為中心聚類點,將N個點分別與K個點計算距離,選擇自己最近的點作為自己的中心點,不斷地更新中心聚集點。
相關概念:
K值:要得到的簇的個數
質心:每個簇的均值向量,即向量各維取品軍即可
距離度量:常用歐幾里得距離和餘弦相似度(先標准化)
兩點之間的距離:
演算法流程:
1 首先確定一個K值,即我們希望將數據集經過聚類得到 K個集合;
2 從數據集中隨機選擇K個數據點作為質心;
3 對數據集中每一個點,計算其與每個質心的距離(如歐式距離),離哪個質心近,就劃分到哪個質心所屬的集合
4 把所有數據歸好集合,一共有K個集合,然後重新計算每個集合的質心;
5 如果新計算出來的質心和原來的質心之間的距離小於某一個設置的閾值(表示重新計算的質心的位置變化不大,趨於穩定,或者說收斂),我們可以認為聚類已經達到期望的結果,演算法終止。
6 如果新質心和原質心距離變化大,需要迭代3-5步驟
K-means實現過程
K-means 聚類演算法是一種非監督學習演算法,被用於非標簽數據(data without defined categories or groups)。該演算法使用迭代細化來產生最終結果。演算法輸入的是集群的數量 K 和數據集。數據集是每個數據點的一組功能。
演算法從 Κ 質心的初始估計開始,其可以隨機生成或從數據集中隨機選擇 。然後演算法在下面兩個步驟之間迭代:
1.數據分配:
每個質心定義一個集群。在此步驟中,基於平方歐氏距離將每個數據點分配到其最近的質心。更正式一點, ci 屬於質心集合 C ,然後每個數據點 x 基於下面的公式被分配到一個集群中。
其中 dist(·)是標准(L2)歐氏距離。讓指向第 i 個集群質心的數據點集合定為 Si 。
2. 質心更新:
在此步驟中,重新計算質心。這是通過獲取分配給該質心集群的所有數據點的平均值來完成的。公式如下:
K-means 演算法在步驟 1 和步驟 2 之間迭代,直到滿足停止條件(即,沒有數據點改變集群,距離的總和最小化,或者達到一些最大迭代次數)。
K 值的選擇
上述演算法找到特定預選 K 值和數據集標簽。為了找到數據中的集群數,用戶需要針對一系列 K 值運行 K-means 聚類演算法並比較結果。通常,沒有用於確定 K 的精確值的方法,但是可以使用以下技術獲得准確的估計。
Elbow point 拐點方法
通常用於比較不同 K 值的結果的度量之一是數據點與其聚類質心之間的平均距離。由於增加集群的數量將總是減少到數據點的距離,因此當 K 與數據點的數量相同時,增加 K 將總是減小該度量,達到零的極值。因此,該指標不能用作唯一目標。相反,繪制了作為 K 到質心的平均距離的函數,並且可以使用減小率急劇變化的「拐點」來粗略地確定 K 。
DBI(Davies-Bouldin Index)
DBI 是一種評估度量的聚類演算法的指標,通常用於評估 K-means 演算法中 k 的取值。簡單的理解就是:DBI 是聚類內的距離與聚類外的距離的比值。所以,DBI 的數值越小,表示分散程度越低,聚類效果越好。
還存在許多用於驗證 K 的其他技術,包括交叉驗證,信息標准,信息理論跳躍方法,輪廓方法和 G 均值演算法等等。
三,數學原理
K-Means採用的啟發式很簡單,可以用下面一組圖來形象的描述:
上述a表達了初始的數據集,假設 k=2 。在圖b中,我們隨機選擇了兩個 k 類所對應的類別質點,即圖中的紅色質點和藍色質點,然後分別求樣本中所有點到這兩個質心的距離,並標記每個樣本類別為和該樣本距離最小的質心的類別,如圖c所示,經過計算樣本和紅色質心和藍色質心的距離,我們得到了所有樣本點的第一輪迭代後的類別。此時我們對我們當前標記為紅色和藍色的點分別求其新的質心,如圖d所示,新的紅色質心和藍色質心大熱位置已經發生了變化。圖e和圖f重復了我們在圖c和圖d的過程,即將所有點的類別標記為距離最近的質心的類別並求出新的質心。最終我們得到的兩個類別如圖f.
四,實例
坐標系中有六個點:
1、我們分兩組,令K等於2,我們隨機選擇兩個點:P1和P2
2、通過勾股定理計算剩餘點分別到這兩個點的距離:
3、第一次分組後結果:
組A:P1
組B:P2、P3、P4、P5、P6
4、分別計算A組和B組的質心:
A組質心還是P1=(0,0)
B組新的質心坐標為:P哥=((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)
5、再次計算每個點到質心的距離:
6、第二次分組結果:
組A:P1、P2、P3
組B:P4、P5、P6
7、再次計算質心:
P哥1=(1.33,1)
P哥2=(9,8.33)
8、再次計算每個點到質心的距離:
9、第三次分組結果:
組A:P1、P2、P3
組B:P4、P5、P6
可以發現,第三次分組結果和第二次分組結果一致,說明已經收斂,聚類結束。
五、K-Means的優缺點
優點:
1、原理比較簡單,實現也是很容易,收斂速度快。
2、當結果簇是密集的,而簇與簇之間區別明顯時, 它的效果較好。
3、主要需要調參的參數僅僅是簇數k。
缺點:
1、K值需要預先給定,很多情況下K值的估計是非常困難的。
2、K-Means演算法對初始選取的質心點是敏感的,不同的隨機種子點得到的聚類結果完全不同 ,對結果影響很大。
3、對噪音和異常點比較的敏感。用來檢測異常值。
4、採用迭代方法, 可能只能得到局部的最優解,而無法得到全局的最優解 。
六、細節問題
1、K值怎麼定?
答:分幾類主要取決於個人的經驗與感覺,通常的做法是多嘗試幾個K值,看分成幾類的結果更好解釋,更符合分析目的等。或者可以把各種K值算出的 E 做比較,取最小的 E 的K值。
2、初始的K個質心怎麼選?
答:最常用的方法是隨機選,初始質心的選取對最終聚類結果有影響,因此演算法一定要多執行幾次,哪個結果更reasonable,就用哪個結果。 當然也有一些優化的方法,第一種是選擇彼此距離最遠的點,具體來說就是先選第一個點,然後選離第一個點最遠的當第二個點,然後選第三個點,第三個點到第一、第二兩點的距離之和最小,以此類推。第二種是先根據其他聚類演算法(如層次聚類)得到聚類結果,從結果中每個分類選一個點。
3、關於離群值?
答:離群值就是遠離整體的,非常異常、非常特殊的數據點,在聚類之前應該將這些「極大」「極小」之類的離群數據都去掉,否則會對於聚類的結果有影響。但是,離群值往往自身就很有分析的價值,可以把離群值單獨作為一類來分析。
4、單位要一致!
答:比如X的單位是米,Y也是米,那麼距離算出來的單位還是米,是有意義的。但是如果X是米,Y是噸,用距離公式計算就會出現「米的平方」加上「噸的平方」再開平方,最後算出的東西沒有數學意義,這就有問題了。
5、標准化
答:如果數據中X整體都比較小,比如都是1到10之間的數,Y很大,比如都是1000以上的數,那麼,在計算距離的時候Y起到的作用就比X大很多,X對於距離的影響幾乎可以忽略,這也有問題。因此,如果K-Means聚類中選擇歐幾里德距離計算距離,數據集又出現了上面所述的情況,就一定要進行數據的標准化(normalization),即將數據按比例縮放,使之落入一個小的特定區間。
❸ 找出一個二維數組的拐點演算法
拐點可以這樣去求:判斷條件:(data[n+1]-data[n])*(data[n+2]-data[n+1])<0,不論波谷還是波峰都可以求,如果要求即使兩個相鄰數一樣也算是拐點的話,那麼條件改為<=0即可!