在我眼裡一切都是那麼簡單,複雜的我也看不懂,最討厭那些複雜的人際關係,唉,像孩子一樣交流不好嗎。
學習k-means演算法時,會讓我想起三國志這個遊戲,介面是一張中國地圖,諸侯分立,各自為據。但是遊戲開始,玩家會是乙個人一座城池(我比較喜歡這樣,就有挑戰性),然後不斷的征戰各方,占領城池
不斷的擴大地盤,正常來說,征戰的城池是距離自己較為近的,然後選擇這些城池的中心位置作為主城。所以過來一段時間後,地圖上就會出現幾個主要的勢力範圍,三足鼎立正是如此。這個過程和k-means演算法十分相似。
接下來我們以下圖為遊戲地圖為例來講解k-means演算法,地圖中的每乙個城池為乙個資料樣例(包含城池的座標),假如遊戲開始設定三個遊戲玩家(三個聚類中心k),遊戲目的希望最後三個玩家各自為據形成右圖的格局。開始遊戲!
k-means(k均值演算法):
一開始先要介紹演算法的整體流程
(1)隨機初始化聚類中心的位置
(2)計算每乙個點到聚類中心的距離,選取最小值分配給k(i)
(3)移動聚類中心(其實就是對所屬它的樣本點求平均值,就是它移動是位置)
(4)重複(2),(3)直到損失函式(也就是所有樣本點到其所歸屬的樣本中心的距離的和最小)
最後整體分類格局會變得穩定。
優化目標,也就是之前我們經常提到的損失函式
在不斷的迴圈過程中,聚類中心也在不斷地更新,直到上式距離總和收斂精確值的時候,獲得最優解。
(1) 隨機初始化
為了遊戲的公平性,使用隨機的方式把三個遊戲玩家分配到地圖上三個城池中(這裡需要注意聚類中心的個數一定要小於資料樣本的個數)。隨機初始化會遇見下面幾種情況
1 好的情況
這種情況最為好,因為三個聚類中心已經很好的散布在三個主要的樣本類上,再執行下面的演算法就可以形成我們想要的分類。
這種情況就不太好,紅點和綠點一開始就分配在以起,所以一開就會產生對立,對於不好的初始化可能會產生以下聚類結果
這種情況就是就很糟糕了,不符合要求。
對於這種情況我們沒有很好的解決辦法,可以嘗試多次初始化,獲取最好的結果,例如設定1000次隨機初始化,選取損失函式值最小的乙個。
還有一種情況,對於有些資料集天生分布不明顯的資料集,怎麼才能正確的選擇聚類中心的個數,例如:
使用(elbow method)「胳膊肘演算法」:
獲取損失函式和聚類中心k的函式影象,大致有兩種影象型別
左圖的拐點明顯,而右圖的拐點不是很明顯,對於左圖我們可以選取拐點處的k作為聚類中心的個數,而如果是右圖,那麼就需要根據情況選取,比如說,如果資料集是衣服的尺碼的資料,如果你想確定這些衣服的尺碼型別,那麼根據你想要分成幾種尺碼型別決定(例如:l,m,s)(還有,m,l,xl,xxl,s)
我眼裡的「網路語言」
剛剛看了個電視節目,正在討論著關於 網路語言 的問題。有說 網路語言 是一種語言的扭曲,有說它是一種語言的退步 甚至有說由於它的存在已經影響到了對語言的教育和正確使用。對於 網路語言 我有我自己的一些看法。對待事物,從不同的角度去看,往往會有截然相反的結論。再次,目前使用網路的人大部分是青年人或中年...
我眼裡的需求版本控制
當開發人員做了乙個已經被取消的功能,你能想想他有多沮喪 當測試人員按照老的測試案例去測試新的需求規格的開發結果時,他可能要抓狂。出現了這些情況,都是因為需求的版本控制出現了問題。說到需求的版本管理,是不是就是需求文件放到配置庫就可以了呢?答案是 不僅僅如此。因為需求有它的特殊性,有它分析和管理的特殊...
我眼裡的需求版本控制
當開發人員做了乙個已經被取消的功能,你能想想他有多沮喪 當測試人員按照老的測試案例去測試新的需求規格的開發結果時,他可能要抓狂。出現了這些情況,都是因為需求的版本控制出現了問題。需求文件的版本 對整個文件進行版本的管理是最基礎的。當談及最新版本時,專案團隊的成員 應該 都知道它指的是哪個版本的文件,...