主要內容包括:
1.Anaconda軟件的安裝過程及簡單配置
2.聚類及Kmeans算法介紹
3.案例分析:Kmeans實現運動員位置聚集
前文推薦:【Python數據挖掘課程】一.安裝Python及爬蟲入門介紹
希望這篇文章對你有所幫助,尤其是剛剛接觸數據挖掘以及大數據的同學,同時準備嘗試以案例爲主的方式進行講解。如果文章中存在不足或錯誤的地方,還請海涵~
一. Anaconda軟件安裝及使用步驟
前面兩節課我是通過Python命令行和IDLE工具進行介紹的,但是裏面的配置比較麻煩,包括pip安裝,selenium、lda各種第三方包的安裝。
從這節課我準備使用Anacaonda軟件來講解,它集成了各種python的第三方包,尤其包括數據挖掘和數據分析常用的幾個包。
下載地址:https://www.continuum.io/downloads/
雲盤分享:http://pan.baidu.com/s/1hrEQ9xi
1. 配置過程
首先簡單介紹安裝過程以及如何使用。
安裝Anaconda
安裝過程如下所示:
安裝最好在C盤默認路徑下(空間不大,方便配置),同時不要使用中文路徑。
安裝完成後,點擊“Finish”。點擊Anaconda文件夾,包括這些exe執行文件:
這裏我們使用Spyder進行編寫Python程序。運行如下所示,左邊是進行代碼編寫的,右下角Console是輸出結果的地方。
安裝第三方包
雖然Anaconda軟件集成了各種各樣的包,但是還是缺少一些第三方包,需要通過調用pip或easy_install命令進行安裝。
然後使用cd ..去到C盤根目錄,cd去到Anaconda的Scripts目錄下,輸入"pip install selenium"安裝selenium相應的包,"pip install lda"安裝lda包。
2. 機器學習常用包
下面這四個包通常用於Python數據挖掘和大數據分析的,包括:
Scikit-Learn
Scikit-Learn是一個基於python的用於數據挖掘和數據分析的簡單且有效的工具,它的基本功能主要被分爲六個部分:分類(Classification)、迴歸(Regression)、聚類(Clustering)、數據降維(Dimensionality Reduction)、模型選擇(Model Selection)、數據預處理(Preprocessing)。
詳見官網:http://scikit-learn.org/stable/
NumPy
NumPy(Numeric Python)系統是Python的一種開源的數值計算擴展,一個用python實現的科學計算包。它提供了許多高級的數值編程工具,如:矩陣數據類型、矢量處理,以及精密的運算庫。專爲進行嚴格的數字處理而產生。
SciPy
SciPy (pronounced "Sigh Pie") 是一個開源的數學、科學和工程計算包。它是一款方便、易於使用、專爲科學和工程設計的Python工具包,包括統計、優化、整合、線性代數模塊、傅里葉變換、信號和圖像處理、常微分方程求解器等等。
Matplotlib
Matplotlib是一個Python的圖形框架,類似於MATLAB和R語言。它是python最著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合交互式地進行製圖。而且也可以方便地將它作爲繪圖控件,嵌入GUI應用程序中。
二. 聚類及Kmeans介紹
這部分內容主要簡單介紹聚類的原理及Kmeans相關知識。
機器學習的基本思想,我還是介紹下面這張圖,非常經典。
這裏講述聚類的部分,我簡單推薦"簡書-程sir"的文章,簡單易懂,很不錯。
推薦地址:http://www.jianshu.com/p/fc91fed8c77b
1. 分類與聚類
聚類
俗話說“物以類聚”,其實從廣義上說,聚類就是將數據集中在某些方面相似的數據成員放在一起。一個聚類就是一些數據實例的集合,其中處於相同聚類中的數據元素彼此相似,但是處於不同聚類中的元素彼此不同。
由於在聚類中那些表示數據類別的分類或分組信息是沒有的,即這些數據是沒有標籤的,所有聚類及時通常被成爲無監督學習(Unsupervised Learning)。
下圖是800篇文章,每個點可以看成一篇文章,然後對文本進行聚類分析,可以看到相同主題的文章是聚集在一起的。總共四個主題,紅色表示景區Spot、藍色表示人物People、黑色表示國家Country、綠色表示動物Animal。
分類
在理解聚類之前,必須要先理解聚類和分類的區別,簡單舉個例子。
分類其實是從特定的數據中挖掘模式,作出判斷的過程。比如Gmail郵箱裏有垃圾郵件分類器,一開始的時候可能什麼都不過濾,在日常使用過程中,我人工對於每一封郵件點選“垃圾”或“不是垃圾”,過一段時間,Gmail就體現出一定的智能,能夠自動過濾掉一些垃圾郵件了。
這是因爲在點選的過程中,其實是給每一條郵件打了一個“標籤”,這個標籤只有兩個值,要麼是“垃圾”,要麼“不是垃圾”,Gmail就會不斷研究哪些特點的郵件是垃圾,哪些特點的不是垃圾,形成一些判別的模式,這樣當一封信的郵件到來,就可以自動把郵件分到“垃圾”和“不是垃圾”這兩個我們人工設定的分類的其中一個。
(1)訓練數據集存在一個類標記號,判斷它是正向數據集(起積極作用,不垃圾郵件),還是負向數據集(起抑制作用,垃圾郵件);
(2)然後需要對數據集進行學習訓練,並構建一個訓練的模型;
(3)通過該模型對預測數據集進預測,並計算其結果的性能。
聚類的的目的也是把數據分類,但是事先我是不知道如何去分的,完全是算法自己來判斷各條數據之間的相似性,相似的就放在一起。在聚類的結論出來之前,我完全不知道每一類有什麼特點,一定要根據聚類的結果通過人的經驗來分析,看看聚成的這一類大概有什麼特點。
總之,聚類主要是"物以類聚",通過相似性把相似元素聚集在一起,它沒有標籤;而分類通過標籤來訓練得到一個模型,對新數據集進行預測的過程,其數據存在標籤的。
2. Kmeans算法
該部分轉載簡書-程sir的文章:聚類、K-Means、例子、細節
K-Means是聚類算法中的最常用的一種,算法最大的特點是簡單,好理解,運算速度快,但是隻能應用於連續型的數據,並且一定要在聚類前需要手工指定要分成幾類。
下面,我們描述一下K-means算法的過程,爲了儘量不用數學符號,所以描述的不是很嚴謹,大概就是這個意思,“物以類聚、人以羣分”:
1、首先輸入k的值,即我們希望將數據集經過聚類得到k個分組。
2、從數據集中隨機選擇k個數據點作爲初始大哥(質心,Centroid)
3、對集合中每一個小弟,計算與每一個大哥的距離(距離的含義後面會講),離哪個大哥距離近,就跟定哪個大哥。
4、這時每一個大哥手下都聚集了一票小弟,這時候召開人民代表大會,每一羣選出新的大哥(其實是通過算法選出新的質心)。
5、如果新大哥和老大哥之間的距離小於某一個設置的閾值(表示重新計算的質心的位置變化不大,趨於穩定,或者說收斂),可以認爲我們進行的聚類已經達到期望的結果,算法終止。
6、如果新大哥和老大哥距離變化很大,需要迭代3~5步驟。
下面這個例子很好的,真心推薦大家學習他的博客。
他搞了6個點,從圖上看應該分成兩推兒,前三個點一堆兒,後三個點是另一堆兒。現在手工執行K-Means,體會一下過程,同時看看結果是不是和預期一致。
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也這麼算,如下:
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.再次計算小弟到大哥的距離:
這時可以看到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.第三次計算小弟到大哥的距離:
這時可以看到P1、P2、P3離P哥1更近,P4、P5、P6離P哥2更近,所以第二次站隊的結果是:
• 組A:P1、P2、P3
• 組B:P4、P5、P6
我們發現,這次站隊的結果和上次沒有任何變化了,說明已經收斂,聚類結束,聚類結果和我們最開始設想的結果完全一致。
三. 案例分析:Kmeans聚類運動員數據
1. 數據集
現在存在下面的數據集,是籃球球員比賽的數據。
數據集地址:KEEL-dataset
- Basketball data set
該數據集主要包括5個特徵(Features),共96行數據。
特徵描述:共5個特徵,每分鐘助攻數、運動員身高、運動員出場時間、運動員年齡和每分鐘得分數。
需求:現在需要通過運動員的數據,判斷他是什麼位置。
如果某些運動員得分高,他可能是得分後衛;如果某些運動員身高高或籃板多,他可能是中鋒;助攻高可能是控衛。
2. 代碼
這裏我僅僅使用兩列數據,助攻數和得分數進行實驗,相當於20*2的矩陣,其中輸出y_pred結果表示聚類的類標。類簇數設置爲3,類標位0、1、2,它也是與20個球員數據一一對應的。
Sklearn機器學習包中導入了KMeans聚類,同時需要注意Matplotlib包繪製圖形的過程。代碼如下,幷包括詳細註釋:
聚類核心代碼:
from sklearn.cluster import KMeans
clf = KMeans(n_clusters=3)
y_pred = clf.fit_predict(X)
繪圖核心代碼:
import matplotlib.pyplot as plt
plt.scatter(x, y, c=y_pred, marker='x')
plt.title("Kmeans-Basketball Data")
plt.xlabel("assists_per_minute")
plt.ylabel("points_per_minute")
plt.show()
3. 運行結果
運行結果如下所示:
如果設置marker='o',輸出圓形,可以看到紅色點很高,他得分和助攻都比較高,相當於籃球裏面的"喬丹",然後中間一部分,右下角一部分助攻很高、得分低,可能是控衛。當然數據集越多,聚類的效果越好。
常見問題:
1、安裝Anaconda不能使用中文路徑,以及電腦名稱爲中文;
2、Spyder如何顯示中文,而不是"口口口"亂碼,需要改Fonts;
3、Matplotlib如何顯示顏色,定義樣式等;
4、如何讀取數據,賦值給變量,在讓其顯示。
希望這篇文章對你有所幫助,主要是介紹一個基於Python的Kmeans聚類案例,後面會陸續詳細介紹各種知識。非常想上好這門課,因爲是我的專業方向,另外學生們真的好棒,好認真,用手機錄像、問問題、配環境等等,只要有用心的學生,我定不負你!同時,這節課的思路好點了,摸着石頭過馬路,需要慢慢學吧,但還是挺享受的,畢竟9800,哈哈哈!
(By:Eastmount 2016-10-10 晚上10點 http://blog.csdn.net/eastmount/ )
最後提供籃球的完整數據集: