02_K-means_非監(jiān)督學習

聲明:本文集的所有文章都只討論Python如何使用sklearn進行機器學習直秆。且學習的部分截圖來自中國大學MOOC上的Python機器學習應用課程以及EduCoder拷获,侵權刪糊余。

2020.3.2

新的學期是真的開始了,就是需要早起有點腦殼疼。而機器學習這邊的算法補全也會陸陸續(xù)續(xù)進行,加油ヾ(?°?°?)??粪滤。

K-means

一、距離

在一個N維的空間中雀扶,每一個點在當前空間建立的坐標系中杖小,都有一個唯一標識的 坐標向量 ,例如在三維空間中就有一個點 P(x, y, z)愚墓。而兩個點之間的距離予权,就是在一定規(guī)則下,兩個坐標向量的計算浪册。以下將會講述 歐氏距離曼哈頓距離扫腺。

  • 歐氏距離
    歐氏距離是指空間中兩個坐標向量的 直線距離 ,所求的是兩個點的最短距離村象。公式如下:
歐氏距離
  • 曼哈頓距離
    曼哈頓距離就像是把兩個坐標向量當成兩間房子笆环,而它們之間隔著很多的十字路口(圖片中左右上下這些箭頭)攒至,計算方法是向量中 各維的差值的絕對值
曼哈頓距離

代碼示范 (點擊可以查看完整代碼)

import numpy as np

def distance(x, y, p=2):
    '''
    input:x(ndarray):第一個樣本的坐標
          y(ndarray):第二個樣本的坐標
          p(int):等于1時為曼哈頓距離躁劣,等于2時為歐氏距離
    output:distance(float):x到y(tǒng)的距離
    '''
    if p == 1:
        distances = np.abs(x - y)
        dis = 0.0
        for dist in distances:
           dis += dist
        distances = dis
    else:
        distances = np.power(x - y, 2)
        dis = 0.0
        for dist in distances:
            dis += dist
        distances = np.sqrt(dis)
    return distances
兩種距離

二迫吐、質(zhì)心

質(zhì)心 是指在樣本空間中的所有樣本的均值點,可以想象為見縫插針的形式账忘。

見縫插針

它是所有樣本的均衡點志膀,也就是說,所有樣本離這一點的距離都是一樣的鳖擒。 K-means算法就是通過不同的質(zhì)心來給樣本聚類的溉浙,每個樣本都被歸類到離它最近的樣本。

代碼示范 (點擊可以查看完整代碼)

def cal_Cmass(data):
    '''
    input:data(ndarray):數(shù)據(jù)樣本
    output:mass(ndarray):數(shù)據(jù)樣本質(zhì)心
    '''
    # ********* Begin *********#
    Cmass = [0] * data.shape[1]
    for d in data:
        Cmass += d
    Cmass /= data.shape[0]
    # ********* End *********#
    return Cmass

這里有一點需要特別說明: 被歸一化之后的數(shù)據(jù)蒋荚, 每一行為一個樣本戳稽,而列就是所有樣本點都具有的特征(屬性),也就是樣本們的維數(shù)圆裕。 比如說广鳍,有3列,就是有三個特征點吓妆,也就是說他們處于一個三維的空間赊时,質(zhì)心也應該是三維的。還有就是行拢, 質(zhì)心的每一維的值是樣本每維的均值祖秒,不需要等于某個樣本。

質(zhì)心

三舟奠、K-means算法思想

K-means算法旨在于使用迭代的方法竭缝,通過設定好的幾個質(zhì)心來對數(shù)據(jù)進行聚類。以下是K-means算法的大致步驟:

  1. 設定分類的數(shù)量與最大迭代數(shù)沼瘫,并隨機生成相應數(shù)量的質(zhì)心第一次的質(zhì)心是隨機的抬纸,因為K-means是非監(jiān)督學習,所以很依賴給出的分類數(shù)耿戚,分多了分少了都會出現(xiàn)沒那么好的結果湿故。而最大迭代數(shù)用于防止死循環(huán)。
  2. 計算樣本點與各質(zhì)心的距離膜蛔,分類坛猪,生成標簽將所有樣本點依次跟每個質(zhì)心計算距離,將其歸類到離它最近的質(zhì)心的一類中皂股,生成一個 標簽數(shù)組 (一個一維數(shù)組墅茉,長度為數(shù)據(jù)源的行數(shù),因為源數(shù)據(jù)一行為一個樣本,所以這個標簽數(shù)組每一個元素就記錄著該樣本對應的類別)就斤。
  3. 更新每一類的質(zhì)心悍募,并再次分類和生成新標簽分類計算,求出每一類樣本的均值战转,更新質(zhì)心搜立。之后每一類都再進行樣本跟每一個質(zhì)心的距離計算,生成新標簽槐秧。
  4. 如果達到最大迭代數(shù),或者所有質(zhì)心都基本不再變化忧设,聚類完畢 : 否則刁标,循環(huán)2、3兩步址晕,直到滿足這些條件膀懈,退出循環(huán),完成聚類谨垃。

代碼示范 (點擊可以查看完整代碼)

# 對整個數(shù)據(jù)集X進行Kmeans聚類启搂,返回其聚類的標簽
def predict(self, X):
    # 從所有樣本中隨機選取self.k樣本作為初始的聚類中心
    # 迭代,直到算法收斂(上一次的聚類中心和這一次的聚類中心幾乎重合)或者達到最大迭代次數(shù)
    # 將所有進行歸類刘陶,歸類規(guī)則就是將該樣本歸類到與其最近的中心
    # 計算新的聚類中心
    # 如果聚類中心幾乎沒有變化胳赌,說明算法已經(jīng)收斂,退出迭代
    self.init_random_centroids(X)
    self.create_clusters(self.centroids_list, X)
    for i in range(self.max_iterations):
        new_centroid = self.update_centroids(self.clusters, X)
        if 0.98 < np.sum((new_centroid / self.centroids_list)) < 1.02:
            break
        self.centroids_list = new_centroid
        self.create_clusters(self.centroids_list, X)
    return self.clusters

在這里說明一下匙隔,我設置只要兩次的所有質(zhì)心只差小于正負0.02疑苫,就可以結束循環(huán)了。

K-means

四纷责、Scikit-learn中的K-means

sklearn 中的 K-means 簡化了步驟捍掺,只需要先使用 fit() 函數(shù)來訓練,再使用 predict() 來預測生成標簽即可再膳。

代碼示范 (點擊可以查看完整代碼)

def kmeans_cluster(data):
    '''
    input:data(ndarray):樣本數(shù)據(jù)
    output:result(ndarray):聚類結果
    '''
    km = KMeans(n_clusters=3, random_state=8)
    km.fit(data)
    result = km.predict(data)
    return result
K-means


?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挺勿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喂柒,更是在濱河造成了極大的恐慌不瓶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胳喷,死亡現(xiàn)場離奇詭異湃番,居然都是意外死亡,警方通過查閱死者的電腦和手機吭露,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門吠撮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事泥兰∨牛” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵鞋诗,是天一觀的道長膀捷。 經(jīng)常有香客問我,道長削彬,這世上最難降的妖魔是什么全庸? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮融痛,結果婚禮上壶笼,老公的妹妹穿的比我還像新娘。我一直安慰自己雁刷,他們只是感情好覆劈,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沛励,像睡著了一般责语。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上目派,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天坤候,我揣著相機與錄音,去河邊找鬼址貌。 笑死铐拐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的练对。 我是一名探鬼主播遍蟋,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼螟凭!你這毒婦竟也來了虚青?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤螺男,失蹤者是張志新(化名)和其女友劉穎棒厘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體下隧,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡奢人,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淆院。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片何乎。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出支救,到底是詐尸還是另有隱情抢野,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布各墨,位于F島的核電站指孤,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贬堵。R本人自食惡果不足惜恃轩,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扁瓢。 院中可真熱鬧详恼,春花似錦、人聲如沸引几。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伟桅。三九已至,卻和暖如春叽掘,著一層夾襖步出監(jiān)牢的瞬間楣铁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工更扁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盖腕,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓浓镜,卻偏偏與公主長得像溃列,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子膛薛,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. 距離的量度 1) 距離 ?距離的定義是一個寬泛的概念:只要滿足非負听隐、自反、三角不等式就可以稱之為距離...
    xieyan0811閱讀 9,133評論 0 4
  • 聚類算法 前面介紹的集中算法都是屬于有監(jiān)督機器學習方法哄啄,這章和前面不同雅任,介紹無監(jiān)督學習算法,也就是聚類算法咨跌。在無監(jiān)...
    飄涯閱讀 41,265評論 3 52
  • 0. 引言 K-Means算法是無監(jiān)督的聚類算法沪么,它實現(xiàn)起來比較簡單,聚類效果也不錯锌半,因此應用很廣泛禽车。K-Mea...
    Liopisces閱讀 1,239評論 0 4
  • 一、算法簡介 1、監(jiān)督學習和非監(jiān)督學習 監(jiān)督學習 監(jiān)督學習是根據(jù)已有的數(shù)據(jù)集哭当,知道輸入和輸出結果之間的關系猪腕。根據(jù)這...
    風之舟閱讀 17,160評論 2 30
  • 小酌酒一壇 淑女長相伴 雪月賞柿紅 風鈴搖屋檐 寒冬臘梅開 幾枝出墻來 庭園深似海 杏酒詩抒懷
    左繼強a閱讀 170評論 1 4