作者:zzZ_CMing
博客:http://blog.csdn.net/zzz_cming
作者好文推薦:
CNN卷積神經網絡原理講解+圖片識別應用(附源碼)
BP神經網絡+TensorFlow做圖片識別
RNN遞歸神經網絡原理介紹+數字識別應用
前言:粗略研究完神經網絡基礎——BP、CNN、RNN、LSTM網絡後自己算是鬆懈了很多,好長的時間都沒有堅持再更新博客了。「腐敗」生活了這麼久,還是要找到自己一點樂趣吧,於是想了一想,決定把《機器學習》的算法研究過得都重新梳理一遍,於是就從無監督學習——聚類開始了
無監督學習也是相對於有監督學習來說的,因為現實中遇到的大部分數據都是未標記的樣本,要想通過有監督的學習就需要事先人為標註好樣本標籤,這個成本消耗、過程用時都很巨大,所以無監督學習就是使用無標籤的樣本找尋數據規律的一種方法
聚類算法就歸屬於機器學習領域下的無監督學習方法。
無監督學習的目的是什麼呢?
分類和聚類的區別是什麼呢?對於分類來說,在給定一個數據集,我們是事先已知這個數據集是有多少個種類的。比如一個班級要進行性別分類,我們就下意識清楚分為「男生」、「女生」兩個類;該班又轉入一個同學A,「男ta」就被分入「男生」類;
而對於聚類來說,給定一個數據集,我們初始並不知道這個數據集包含多少類,我們需要做的就是將該數據集依照某個「指標」,將相似指標的數據歸納在一起,形成不同的類;
分類是一個後續的過程,已知標籤數據,再將測試樣本分入同標籤數據集中;聚類是不知道標籤,將「相似指標」的數據強行「擼」在一起,形成各個類。
聚類算法主要包含:K-means、DBSCAN(未完善)
(a)圖:展示出樣本集空間中各個數據點的分布情況;
(b)圖:給定了兩個中心點:紅叉叉點、藍叉叉點;
(c)圖:樣本集中的數據點,離哪個中心點近,就把數據點分屬到哪個類別中;
(d)圖:在分屬好的類別中依照類內距離的平均值,得到新的中心點——原有中心點就從(c)圖中的位置轉移到新的中心點位置;
(e)圖:在得到新的中心點後,再依據離哪個中心點近,就把數據點分屬到哪個類別中的方法,重新劃分聚類;直到成(f)圖,中心點不再變化,聚類結束。
舉個慄子:我們有五個樣本點a(0,2)、b(0,0)、c(1.5,0)、d(5,0)、e(5,2),選取前兩個樣本點a(0,2)、b(0,0)作為初始聚類中心點A、B,開始聚類:
對於點c(1.5,0),到a點的(歐式)距離為2.5,到b點距離為1.5,所以c點分配給B類;
同例,d點分入B類、e點分入A類;於是更新後得到的新簇:A類={a,e},B類={b,c,d}
每迭代一次都計算一次平均誤差:平均誤差是等於新簇內的點到原有中心點距離的平方和,例如
再得到總體的平均誤差E=25+27.25=52.25
重新計算新的簇內中心點:A=((0+5)/2,(2+2)/2)=(2.5,2)、B=((0+1.5+5)/3,(0+0+0)/3)=(2.17,0),重複1、2、3步驟,再得到新的平均誤差E=25.62,誤差顯著減小。由於經過兩次迭代後,中心點不再變化,所以停止迭代,聚類結束。
由於K-means 算法對初選的K值是敏感的,計算平均誤差就是為了K值的選取,請看下圖:
平均誤差會隨K值的選取而改變,隨著K值增大,平均誤差會逐漸降低;極限情況下是每個樣本點是都是一個類,這時的平均誤差E=0,當然這種聚類沒有研究的價值。
那麼哪個K值是最佳選取的值呢——肘部法則,就是選取斜率變化較大的拐點處定為K值點,這只是一種簡單的選取規則,方便簡單而且實用。
# -*- coding:utf-8 -*-# -*- author:zzZ_CMing# -*- 2018/04/10;14:44# -*- python3.5import numpy as npimport matplotlib.pyplot as pltimport sklearn.datasets as dsimport matplotlib.colorsfrom sklearn.cluster import KMeans# 隨機生成數據points_number = 3000centers = 20data,laber=ds.make_blobs(points_number,centers=centers,random_state=0)# 創建Figurefig = plt.figure()# 用來正常顯示中文標籤matplotlib.rcParams['font.sans-serif'] = [u'SimHei']# 用來正常顯示負號matplotlib.rcParams['axes.unicode_minus'] = False# 原始點的分布ax1 = fig.add_subplot(211)plt.scatter(data[:,0],data[:,1],c=laber)plt.title(u'原始數據分布')plt.sca(ax1)# K-means聚類後N = 5model = KMeans(n_clusters = N,init = 'k-means++')y_pre = model.fit_predict(data)ax2 = fig.add_subplot(212)plt.scatter(data[:,0],data[:,1],c=y_pre)plt.title(u'K-Means聚類')plt.sca(ax2)plt.show()
效果展示:
讚賞作者
Python愛好者社區歷史文章大合集:
Python愛好者社區歷史文章列表(每周append更新一次)
福利:文末掃碼立刻關注公眾號,「Python愛好者社區」,開始學習Python課程:
關注後在公眾號內回復「課程」即可獲取:
小編的Python入門視頻課程!!!
崔老師爬蟲實戰案例免費學習視頻。
丘老師數據科學入門指導免費學習視頻。
陳老師數據分析報告製作免費學習視頻。
玩轉大數據分析!Spark2.X+Python 精華實戰課程免費學習視頻。
丘老師Python網絡爬蟲實戰免費學習視頻。