【火爐煉AI】機器學習020-使用K-means算法對數(shù)據(jù)進行聚類分析

【火爐煉AI】機器學習020-使用K-means算法對數(shù)據(jù)進行聚類分析

(本文所使用的Python庫和版本號: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

前面的機器學習類文章(編號從010-019)都是關于監(jiān)督學習乍恐,但是從本篇文章開始,煉丹老頑童要開始講解無監(jiān)督學習方面祭往,無監(jiān)督學習是指處理的數(shù)據(jù)沒有任何形式的標記肤晓,我們沒有對訓練數(shù)據(jù)集進行實現(xiàn)的類別劃分主胧,故而相當于抹黑處理迄委,要讓機器學習自己找出樣本所屬的類別蚌吸,那么機器學習通過什么方式來找出“所屬類別”了?這就是聚類算法的作用了龄坪。

聚類算法璃俗,其核心思想就是中國的“人以類聚,物以群分”悉默,就是機器學習將通過一定的算法來將樣本劃分類別,使得相互之間相似的樣本劃分為一個類別苟穆,不相似的樣本劃分為不同的類別中抄课。

K-means算法是最流行的聚類算法之一,這種算法常常利用數(shù)據(jù)的不同屬性將輸入數(shù)據(jù)劃分為K組雳旅,這種劃分是使用最優(yōu)化的技術實現(xiàn)的跟磨,讓各組內的數(shù)據(jù)點與該組中心點的距離平方和最小化。

說起來很抽象攒盈,讓人感覺云里霧里抵拘,那么我們看一個簡單的實例吧。


1. 準備數(shù)據(jù)集

本次所使用的數(shù)據(jù)集是我前面的文章【火爐煉AI】機器學習010-用樸素貝葉斯分類器解決多分類問題中所采用的數(shù)據(jù)集型豁,一個具有四種不同類別僵蛛,兩種不同features的小數(shù)據(jù)集尚蝌,其加載方法和顯示方法如下所示。

# 準備數(shù)據(jù)集
data_path='E:\PyProjects\DataSet\FireAI/data_multivar.txt'
df=pd.read_csv(data_path,header=None)
# print(df.head())
# print(df.info()) # 查看數(shù)據(jù)信息充尉,確保沒有錯誤
dataset_X,dataset_y=df.iloc[:,:-1],df.iloc[:,-1]
# print(dataset_X.head())
print(dataset_X.info())
print('-'*100)
print(dataset_y.head())
dataset_X=dataset_X.values
dataset_y=dataset_y.values
# print(dataset_X.shape) # (400, 2)
# print(dataset_y.shape) # (400,)

-------------------------------------輸---------出--------------------------------

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 400 entries, 0 to 399
Data columns (total 2 columns):
0 400 non-null float64
1 400 non-null float64
dtypes: float64(2)
memory usage: 6.3 KB
None

--------------------------------------------完-------------------------------------

表明結果數(shù)據(jù)集已經(jīng)正確地加載到內存中飘言,且每一個features中都沒有Null值,我們無需做進一步的缺失值處理驼侠。

下面將這個數(shù)據(jù)集進行2D可視化姿鸿,如下是可視化的代碼:

# 無標簽數(shù)據(jù)集可視化,將第一列feature作為X倒源,第二列feature作為y
def visual_2D_dataset_dist(dataset):
    '''將二維數(shù)據(jù)集dataset顯示在散點圖中'''
    assert dataset.shape[1]==2,'only support dataset with 2 features'
    plt.figure()
    X=dataset[:,0]
    Y=dataset[:,1]
    plt.scatter(X,Y,marker='v',c='g',label='dataset')
    
    X_min,X_max=np.min(X)-1,np.max(X)+1
    Y_min,Y_max=np.min(Y)-1,np.max(Y)+1
    plt.title('dataset distribution')
    plt.xlim(X_min,X_max)
    plt.ylim(Y_min,Y_max)
    plt.xlabel('feature_0')
    plt.ylabel('feature_1')
    plt.legend()
    
visual_2D_dataset_dist(dataset_X)

得到的結果如下:

無標簽數(shù)據(jù)集的可視化

########################小**********結###############################

1. 本數(shù)據(jù)集的加載很簡單苛预,只需用Pandas就可以直接加載,且不需要做其他處理笋熬。

2. 此處需要注意热某,無標簽數(shù)據(jù)集的二維平面可視化,不能使用label數(shù)據(jù)突诬,故而此處的可視化函數(shù)和我以往文章中的可視化函數(shù)是不一樣的苫拍,此處需要額外注意。

3. 從二維平面散點圖中可以看出旺隙,這個數(shù)據(jù)集大概可以分為4個不同的類別绒极,即數(shù)據(jù)都分布在四個族群里,這就是我們可以用K-mean算法的基礎蔬捷。

#################################################################


2. 構建K-means算法

構建K-means算法的過程很簡單垄提,和其他的SVM,隨機森林算法的構建方式一樣周拐,如下代碼:

# 定義一個k-means對象
from sklearn.cluster import KMeans
kmeans=KMeans(init='k-means++',n_clusters=4,n_init=10)
# 這幾個參數(shù)是初始化設定的铡俐,其中n_clusters是從二維散點圖中看出大概有4個族群
kmeans.fit(dataset_X)

-------------------------------------輸---------出--------------------------------

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=4, n_init=10, n_jobs=1, precompute_distances='auto',
random_state=None, tol=0.0001, verbose=0)

--------------------------------------------完-------------------------------------

雖然此處我們定義了一個KMeans對象,且使用我們的無標簽數(shù)據(jù)集進行了訓練妥粟,可是訓練結果怎么樣了审丘?我們怎么知道k-means算法是否正確的劃分了不同類別?

所以我們需要一個可視化的結果勾给,就像前面文章中提到的SVM分類結果圖一樣滩报,此處我們定義了一個專門用于可視化K-means聚類結果的函數(shù),并用該函數(shù)來查看此處聚類的效果播急。代碼如下:

def visual_kmeans_effect(k_means,dataset):
    assert dataset.shape[1]==2,'only support dataset with 2 features'
    X=dataset[:,0]
    Y=dataset[:,1]
    X_min,X_max=np.min(X)-1,np.max(X)+1
    Y_min,Y_max=np.min(Y)-1,np.max(Y)+1
    X_values,Y_values=np.meshgrid(np.arange(X_min,X_max,0.01),
                                  np.arange(Y_min,Y_max,0.01))
    # 預測網(wǎng)格點的標記
    predict_labels=k_means.predict(np.c_[X_values.ravel(),Y_values.ravel()])
    predict_labels=predict_labels.reshape(X_values.shape)
    plt.figure()
    plt.imshow(predict_labels,interpolation='nearest',
               extent=(X_values.min(),X_values.max(),
                       Y_values.min(),Y_values.max()),
               cmap=plt.cm.Paired,
               aspect='auto',
               origin='lower')
    
    # 將數(shù)據(jù)集繪制到圖表中
    plt.scatter(X,Y,marker='v',facecolors='none',edgecolors='k',s=30)
    
    # 將中心點回執(zhí)到圖中
    centroids=k_means.cluster_centers_
    plt.scatter(centroids[:,0],centroids[:,1],marker='o',
                s=100,linewidths=2,color='k',zorder=5,facecolors='b')
    plt.title('K-Means effect graph')
    plt.xlim(X_min,X_max)
    plt.ylim(Y_min,Y_max)
    plt.xlabel('feature_0')
    plt.ylabel('feature_1')
    plt.show()
    
visual_kmeans_effect(kmeans,dataset_X)
K-means聚類對本數(shù)據(jù)集的聚類結果

########################小**********結###############################

1. 定義K-means聚類算法的方法很簡單脓钾,只需要從sklearn.cluster中導入KMeans,并定義一個KMeans對象即可桩警,直接用fit()函數(shù)可以直接訓練可训。

2. 此處使用k-means聚類算法對數(shù)據(jù)進行了聚類分析,可以使用函數(shù)visual_kmeans_effect()來直接查看聚類后的效果圖。

3. 雖然可以直觀看到效果圖握截,但效果圖還是難以量化k-means聚類算法的準確度飞崖,這些內容將在后續(xù)文章中講解。

#################################################################


注:本部分代碼已經(jīng)全部上傳到(我的github)上川蒙,歡迎下載蚜厉。

參考資料:

1, Python機器學習經(jīng)典實例,Prateek Joshi著畜眨,陶俊杰昼牛,陳小莉譯

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市康聂,隨后出現(xiàn)的幾起案子贰健,更是在濱河造成了極大的恐慌,老刑警劉巖恬汁,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伶椿,死亡現(xiàn)場離奇詭異,居然都是意外死亡氓侧,警方通過查閱死者的電腦和手機脊另,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來约巷,“玉大人偎痛,你說我怎么就攤上這事《览桑” “怎么了踩麦?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氓癌。 經(jīng)常有香客問我谓谦,道長,這世上最難降的妖魔是什么贪婉? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任反粥,我火速辦了婚禮,結果婚禮上疲迂,老公的妹妹穿的比我還像新娘星压。我一直安慰自己,他們只是感情好鬼譬,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逊脯,像睡著了一般优质。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天巩螃,我揣著相機與錄音演怎,去河邊找鬼。 笑死避乏,一個胖子當著我的面吹牛爷耀,可吹牛的內容都是我干的。 我是一名探鬼主播拍皮,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼歹叮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了铆帽?” 一聲冷哼從身側響起咆耿,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爹橱,沒想到半個月后萨螺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡愧驱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年慰技,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片组砚。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡吻商,死狀恐怖,靈堂內的尸體忽然破棺而出惫确,到底是詐尸還是另有隱情手报,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布改化,位于F島的核電站掩蛤,受9級特大地震影響,放射性物質發(fā)生泄漏陈肛。R本人自食惡果不足惜揍鸟,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望句旱。 院中可真熱鬧阳藻,春花似錦、人聲如沸谈撒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啃匿。三九已至蛔外,卻和暖如春蛆楞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夹厌。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工豹爹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人矛纹。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓臂聋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親或南。 傳聞我的和親對象是個殘疾皇子孩等,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容