聚類、K-Means、例子、細節

聚類#####

今天說聚類,但是必須要先理解聚類和分類的區別,很多業務人員在日常分析時候不是很嚴謹,混為一談,其實二者有本質的區別。

分類其實是從特定的數據中挖掘模式,作出判斷的過程。比如Gmail郵箱里有垃圾郵件分類器,一開始的時候可能什么都不過濾,在日常使用過程中,我人工對于每一封郵件點選“垃圾”或“不是垃圾”,過一段時間,Gmail就體現出一定的智能,能夠自動過濾掉一些垃圾郵件了。這是因為在點選的過程中,其實是給每一條郵件打了一個“標簽”,這個標簽只有兩個值,要么是“垃圾”,要么“不是垃圾”,Gmail就會不斷研究哪些特點的郵件是垃圾,哪些特點的不是垃圾,形成一些判別的模式,這樣當一封信的郵件到來,就可以自動把郵件分到“垃圾”和“不是垃圾”這兩個我們人工設定的分類的其中一個。

** 聚類**的的目的也是把數據分類,但是事先我是不知道如何去分的,完全是算法自己來判斷各條數據之間的相似性,相似的就放在一起。在聚類的結論出來之前,我完全不知道每一類有什么特點,一定要根據聚類的結果通過人的經驗來分析,看看聚成的這一類大概有什么特點。

K-Means#####

聚類算法有很多種(幾十種),K-Means是聚類算法中的最常用的一種,算法最大的特點是簡單,好理解,運算速度快,但是只能應用于連續型的數據,并且一定要在聚類前需要手工指定要分成幾類。

下面,我們描述一下K-means算法的過程,為了盡量不用數學符號,所以描述的不是很嚴謹,大概就是這個意思,“物以類聚、人以群分”:

  1. 首先輸入k的值,即我們希望將數據集經過聚類得到k個分組。
  2. 從數據集中隨機選擇k個數據點作為初始大哥(質心,Centroid)
  3. 對集合中每一個小弟,計算與每一個大哥的距離(距離的含義后面會講),離哪個大哥距離近,就跟定哪個大哥。
  4. 這時每一個大哥手下都聚集了一票小弟,這時候召開人民代表大會,每一群選出新的大哥(其實是通過算法選出新的質心)。
  5. 如果新大哥和老大哥之間的距離小于某一個設置的閾值(表示重新計算的質心的位置變化不大,趨于穩定,或者說收斂),可以認為我們進行的聚類已經達到期望的結果,算法終止。
  6. 如果新大哥和老大哥距離變化很大,需要迭代3~5步驟。
簡單的手算例子#####

我搞了6個點,從圖上看應該分成兩推兒,前三個點一堆兒,后三個點是另一堆兒。現在手工執行K-Means,體會一下過程,同時看看結果是不是和預期一致。

case

1.選擇初始大哥:我們就選P1和P2

2.計算小弟和大哥的距離:P3到P1的距離從圖上也能看出來(勾股定理),是√10 = 3.16;P3到P2的距離√((3-1)2+(1-2)2 = √5 = 2.24,所以P3離P2更近,P3就跟P2混。同理,P4、P5、P6也這么算,如下:

round1
P3到P6都跟P2更近,所以第一次站隊的結果是:

  • 組A:P1
  • 組B:P2、P3、P4、P5、P6

3.人民代表大會:組A沒啥可選的,大哥還是P1自己組B有五個人,需要選新大哥,這里要注意選大哥的方法是每個人X坐標的平均值和Y坐標的平均值組成的新的點,為新大哥,也就是說這個大哥是“虛擬的”。因此,B組選出新大哥的坐標為:P哥((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)。綜合兩組,新大哥為P1(0,0),P哥(6.2,5.6),而P2-P6重新成為小弟

4.再次計算小弟到大哥的距離:

round2
這時可以看到P2、P3離P1更近,P4、P5、P6離P哥更近,所以第二次站隊的結果是:

  • 組A:P1、P2、P3
  • 組B:P4、P5、P6(虛擬大哥這時候消失)

5.第二屆人民代表大會:按照上一屆大會的方法選出兩個新的虛擬大哥:P哥1(1.33,1) P哥2(9,8.33),P1-P6都成為小弟

6.第三次計算小弟到大哥的距離:

round3
這時可以看到P1、P2、P3離P哥1更近,P4、P5、P6離P哥2更近,所以第二次站隊的結果是:

  • 組A:P1、P2、P3
  • 組B:P4、P5、P6

我們發現,這次站隊的結果和上次沒有任何變化了,說明已經收斂,聚類結束,聚類結果和我們最開始設想的結果完全一致。

K-Means的細節問題#####
  1. K值怎么定?我怎么知道應該幾類?答:這個真的沒有確定的做法,分幾類主要取決于個人的經驗與感覺,通常的做法是多嘗試幾個K值,看分成幾類的結果更好解釋,更符合分析目的等。或者可以把各種K值算出的SSE做比較,取最小的SSE的K值。

  2. 初始的K個質心怎么選?答:最常用的方法是隨機選,初始質心的選取對最終聚類結果有影響,因此算法一定要多執行幾次,哪個結果更reasonable,就用哪個結果。 當然也有一些優化的方法,第一種是選擇彼此距離最遠的點,具體來說就是先選第一個點,然后選離第一個點最遠的當第二個點,然后選第三個點,第三個點到第一、第二兩點的距離之和最小,以此類推。第二種是先根據其他聚類算法(如層次聚類)得到聚類結果,從結果中每個分類選一個點。

  3. K-Means會不會陷入一直選質心的過程,永遠停不下來?答:不會,有數學證明K-Means一定會收斂,大致思路是利用SSE的概念(也就是誤差平方和),即每個點到自身所歸屬質心的距離的平方和,這個平方和是一個函數,然后能夠證明這個函數是可以最終收斂的函數。

  4. 判斷每個點歸屬哪個質心的距離怎么算?答:這個問題必須不得不提一下數學了……第一種,歐幾里德距離(歐幾里德這位爺還是很厲害的,《幾何原本》被稱為古希臘數學的高峰,就是用5個公理推導出了整個平面幾何的結論),這個距離就是平時我們理解的距離,如果是兩個平面上的點,也就是(X1,Y1),和(X2,Y2),那這倆點距離是多少初中生都會,就是√( (x1-x2)2+(y1-y2)2) ,如果是三維空間中呢?√( (x1-x2)2+(y1-y2)2+(z1-z2)^2 ;推廣到高維空間公式就以此類推。可以看出,歐幾里德距離真的是數學加減乘除算出來的距離,因此這就是只能用于連續型變量的原因。第二種,余弦相似度,余弦相似度用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比距離度量,余弦相似度更加注重兩個向量在方向上的差異,而非距離或長度上。下圖表示余弦相似度的余弦是哪個角的余弦,A,B是三維空間中的兩個向量,這兩個點與三維空間原點連線形成的角,如果角度越小,說明這兩個向量在方向上越接近,在聚類時就歸成一類:

    cosine
    看一個例子(也許不太恰當):歌手大賽,三個評委給三個歌手打分,第一個評委的打分(10,8,9) 第二個評委的打分(4,3,2),第三個評委的打分(8,9,10)如果采用余弦相似度來看每個評委的差異,雖然每個評委對同一個選手的評分不一樣,但第一、第二兩個評委對這四位歌手實力的排序是一樣的,只是第二個評委對滿分有更高的評判標準,說明第一、第二個評委對音樂的品味上是一致的。因此,用余弦相似度來看,第一、第二個評委為一類人,第三個評委為另外一類。如果采用歐氏距離, 第一和第三個評委的歐氏距離更近,就分成一類人了,但其實不太合理,因為他們對于四位選手的排名都是完全顛倒的。總之,如果注重數值本身的差異,就應該用歐氏距離,如果注重的是上例中的這種的差異(我概括不出來到底是一種什么差異……),就要用余弦相似度來計算。還有其他的一些計算距離的方法,但是都是歐氏距離和余弦相似度的衍生,簡單羅列如下:明可夫斯基距離、切比雪夫距離、曼哈頓距離、馬哈拉諾比斯距離、調整后的余弦相似度、Jaccard相似系數……

  5. 還有一個重要的問題是,大家的單位要一致!比如X的單位是米,Y也是米,那么距離算出來的單位還是米,是有意義的但是如果X是米,Y是噸,用距離公式計算就會出現“米的平方”加上“噸的平方”再開平方,最后算出的東西沒有數學意義,這就有問題了。還有,即使X和Y單位一致,但是如果數據中X整體都比較小,比如都是1到10之間的數,Y很大,比如都是1000以上的數,那么,在計算距離的時候Y起到的作用就比X大很多,X對于距離的影響幾乎可以忽略,這也有問題。因此,如果K-Means聚類中選擇歐幾里德距離計算距離,數據集又出現了上面所述的情況,就一定要進行數據的標準化(normalization),即將數據按比例縮放,使之落入一個小的特定區間。去除數據的單位限制,將其轉化為無量綱的純數值,便于不同單位或量級的指標能夠進行計算和比較。標準化方法最常用的有兩種:

  • min-max標準化(離差標準化):對原始數據進行線性變換,是結果落到【0,1】區間,轉換方法為 X'=(X-min)/(max-min),其中max為樣本數據最大值,min為樣本數據最小值。
  • z-score標準化(標準差標準化):處理后的數據符合標準正態分布(均值為0,方差為1),轉換公式:X減去均值,再除以標準差
  1. 每一輪迭代如何選出新的質心?答:各個維度的算術平均,比如(X1,Y1,Z1)、(X2,Y2,Z2)、(X3,Y3,Z3),那就新質心就是【(X1+X2+X3)/3,(Y1+Y2+Y3)/3,(Z1,Z2,Z3)/3】,這里要注意,新質心不一定是實際的一個數據點。

  2. 關于離群值?答:離群值就是遠離整體的,非常異常、非常特殊的數據點,在聚類之前應該將這些“極大”“極小”之類的離群數據都去掉,否則會對于聚類的結果有影響。但是,離群值往往自身就很有分析的價值,可以把離群值單獨作為一類來分析。

  3. 用SPSS作出的K-Means聚類結果,包含ANOVA(單因素方差分析),是什么意思?答:答簡單說就是判斷用于聚類的變量是否對于聚類結果有貢獻,方差分析檢驗結果越顯著的變量,說明對聚類結果越有影響。對于不顯著的變量,可以考慮從模型中剔除。

五、聚類分析中業務專家的作用#####

業務專家的作用非常大,主要體現在聚類變量的選擇和對于聚類結果的解讀:

  1. 比如要對于現有的客戶分群,那么就要根據最終分群的目的選擇不同的變量來分群,這就需要業務專家經驗支持。如果要優化客戶服務的渠道,那么就應選擇與渠道相關的數據;如果要推廣一個新產品,那就應該選用用戶目前的使用行為的數據來歸類用戶的興趣。算法是無法做到這一點的
  2. 欠缺經驗的分析人員和經驗豐富的分析人員對于結果的解讀會有很大差異。其實不光是聚類分析,所有的分析都不能僅僅依賴統計學家或者數據工程師。
作者:程sir 鏈接:http://www.jianshu.com/p/fc91fed8c77b 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387359.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖的廣度優先遍歷

#include <iostream> #include <vector> #include <queue> using namespace std;const int MAXV 1000; const int INF 1000000000; //下標代表點,數組元素代表連接的點 //圖的鄰接表 vector<int> Adj[MAXV]; //頂點數 int n;//DFS 如果頂點i已經被…

3.8 平均數

求若干整數的平均數&#xff0c;結果保留三位小數。 輸入樣例&#xff1a;第一個數字代表數據個數 3 6 5 18 4 1 2 3 4 輸出樣例&#xff1a; 9.667 2.500 #include<iostream> #include<fstream> using namespace std;int main() {ifstream cin("test.t…

從決策樹學習談到貝葉斯分類算法、EM、HMM

引言 最近在面試中(點擊查看&#xff1a;我的個人簡歷&#xff0c;求職意向&#xff0c;擇司標準)&#xff0c;除了基礎 & 算法 & 項目之外&#xff0c;經常被問到或被要求介紹和描述下自己所知道的幾種分類或聚類算法(當然&#xff0c;這完全不代表你將來的面試中會遇…

gdb調試的基本使用

GDB調試 啟動程序準備調試 GDB yourpram 或者 先輸入GDB 然后輸入 file yourpram然后使用run或者r命令開始程序的執行,也可以使用 run parameter將參數傳遞給該程序參數列表  命令 命令縮寫 命令說明 list l 顯示多行源代碼 break b 設置斷點,程序運行到斷點的位置會停…

3.9 對稱三位素數

素數&#xff1a;只能被1和自身整除 判斷一個數是否是素數&#xff1a;判斷從2到sqrt(n)的整數中是否有其約數 判斷一個數是否是三位素數。 輸入樣例&#xff1a; 11 101 272 輸出樣例&#xff1a; No Yes No #include<iostream> #include<fstream> #incl…

決策樹的過擬合問題

決策樹的過擬合問題決策樹是一種分類器&#xff0c;通過ID3&#xff0c;C4.5和CART等算法可以通過訓練數據構建一個決策樹。但是&#xff0c;算法生成的決策樹非常詳細并且龐大&#xff0c;每個屬性都被詳細地加以考慮&#xff0c;決策樹的樹葉節點所覆蓋的訓練樣本都是“純”的…

計算機網絡與協議

計算機網絡&#xff1a; TCP/IP中只要是能夠設定IP地址的計算機就成為主機 網絡按其規模可分為&#xff1a; WAN&#xff08;廣域網&#xff09;&#xff1a;覆蓋多個遠距離區域的遠程網絡 MAN&#xff08;城域網&#xff09;&#xff1a;比廣域網小一級&#xff0c;連接整個城…

3.10 十進制轉換為二進制

將十進制整數轉換成二進制數 對于每個n&#xff0c;以11位的寬度右對齊輸出n值&#xff0c;然后輸出"-->"&#xff0c;然后輸出二進制數。 輸入樣例&#xff1a; 2 0 -12 1 輸出樣例&#xff1a; 2-->10 0-->0 -12-->-1100 1-->1 #include<…

對線性回歸、邏輯回歸、各種回歸的概念學習

回歸問題的條件/前提&#xff1a; 1&#xff09; 收集的數據 2&#xff09; 假設的模型&#xff0c;即一個函數&#xff0c;這個函數里含有未知的參數&#xff0c;通過學習&#xff0c;可以估計出參數。然后利用這個模型去預測/分類新的數據。 1. 線性回歸 假設 特征 和 結果 都…

redis的源碼編譯安裝+發布訂閱+RDB持久化

redis的源碼編譯安裝發布訂閱RDB持久化轉載于:https://www.cnblogs.com/zwq-/p/10420455.html

Shell基礎1

0 Shell基礎 0.1 Shell是什么 0.1.1 Shell是什么 Shell是一個命令行解釋器&#xff0c;它為用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序&#xff0c;用戶可以用Shell來啟動、掛起、停止甚至編寫一些程序。 硬件 <-內核 <- Shell命令解釋器<-外層應…

centos7自帶數據庫MariaDB重啟和修改密碼

1&#xff1a;MariaDB和mysql差不多是mysql的一個分支&#xff0c;完全兼容mysql的命令。 2&#xff1a;centos 7 中自帶MariaDB&#xff0c; 需要在centos中安裝mysql的時候就需要多注意了。 3&#xff1a;啟動 停止 重啟 MariaDB systemctl start mariadb.service #啟動Maria…

Shell基礎2

0.12 數值運算與運算符 aa11 bb22 cc$aa$bb echo $cc #1122&#xff0c;因為變量默認是字符串類型 1、declare聲明變量類型 declare /- 選項 變量名 選項&#xff1a; - 給變量設定類型屬性 取消變量的類型屬性 -i 將變量聲明為整數型 -x 將變量聲明為環境變量 …

XGBoost入門及實戰

kaggle比賽必備算法XGBoost入門及實戰 xgboost一直在kaggle競賽江湖里被傳為神器&#xff0c;它在對結構化數據的應用占據主導地位&#xff0c;是目前開源的最快最好的工具包&#xff0c;與常見的工具包算法相比速度提高了10倍以上&#xff01; XGBoost is an implementation o…

幾個常用算法的適應場景及其優缺點

機器學習算法太多了&#xff0c;分類、回歸、聚類、推薦、圖像識別領域等等&#xff0c;要想找到一個合適算法真的不容易&#xff0c;所以在實際應用中&#xff0c;我們一般都是采用啟發式學習方式來實驗。通常最開始我們都會選擇大家普遍認同的算法&#xff0c;諸如SVM&#x…

p1012拼數題解

#include<iostream> #include<algorithm> using namespace std; bool cmp(string b,string a) {return ba>ab;}//靈魂在這 int main() {string a[21];int n;cin>>n;for(int i1;i<n;i)cin>>a[i];sort(a1,an1,cmp);for(int i1;i<n;i)cout<&l…

常見算法及問題場景——圖

最短路徑 現實場景 1、一批貨從北京到廣州的的最快&#xff0c;或最省錢的走法。 把路線中各城市當作圖的頂點&#xff0c;各城市之間的花費時間&#xff0c;或金錢當作邊的權重&#xff0c;求兩點之間的最短路徑。 2、在城市群中建一個倉儲基地&#xff0c;建在什么位置可以…

EF ++屬性會更新實體

var lastBaby await _babyRepository.FirstOrDefaultAsync(); lastBaby.sort; -- sort原本為1 -- 最終會生成一條語句更新sort字段 exec sp_executesql NSET NOCOUNT ON;UPDATE [Babies] SET [BirthOrder] p0, [LastModificationTime] p1WHERE [Id] p2;SELECT ROWCOUNT; ,N…

分類算法應用場景實例二十則

1 O2O優惠券使用預測 以優惠券盤活老用戶或吸引新客戶進店消費是O2O的一種重要營銷方式。然而隨機投放的優惠券對多數用戶造成無意義的干擾。對商家而言&#xff0c;濫發的優惠券可能降低品牌聲譽&#xff0c;同時難以估算營銷成本。個性化投放是提高優惠券核銷率的重要技術&am…

Shell03

查看字符數的方法&#xff1a; seq -s " " 100 #以空格為分隔符&#xff0c;輸出從1到100 seq 100 #以換行為分隔符 charsseq -s " " 100 echo $chars echo ${#chars} #統計字符數 echo $(expr length "$chars") #統計字符數 echo $cha…