102、聚類Kmeans演算法

weixin_34413357發表於2017-12-08

這兩天學習聚類中的Kmeans演算法,有關Kmeans演算法的介紹我推薦看"簡書-程sir"的文章,簡單易懂。

推薦地址:http://www.jianshu.com/p/fc91fed8c77b

下面直接看案例:Kmeans聚類分析運動員資料

在籃球這項運動中,每一位球員在球場上都有一個位置,如果某些運動員得分高,他可能是得分後衛;如果某些運動員身高高或籃板多,他可能是中鋒;助攻高可能是控衛。而現在有一個資料集data.txt,資料集的部分截圖如下:


6626611-ccfc059a191d1228.png
圖片發自簡書App

在這個資料集裡面包含了96行資料對應著96位籃球運動員,這些資料每一列分別是每分鐘助攻數(assists_per_minute)、運動員身高(height)、運動員出場時間(time_played)、運動員年齡(age)和每分鐘得分數(points_per_minute)。

現在需要通過運動員的資料,判斷他適合打哪個位置。

接下來選取了每分鐘助攻數(assists_per_minute)和每分鐘得分數(points_per_minute)這兩列資料進行分析:,程式碼如下:

# -*- coding: utf-8 -*-

import os

data = []

# 讀取檔案

filename = "data.txt"

with open(filename) as f_ob:

    lines = f_ob.readlines()



for line in lines:

    line = line.rstrip() # 刪除換行

    result = ' '.join(line.split()) #刪除多餘空格,儲存一個空格連線

    # 獲取每行的五個值,將字串格式轉換為浮點數

    s = [float(x) for x in result.strip().split(' ')]

    print s

    data.append(s)  # 將資料儲存在data



print("完整資料集")

print data          # 輸出完整資料集

print type(data)    # 顯示資料集的型別



print("第一列和第五列資料")

L2 = [n[0] for n in data]  # n[0]表示第一列

print L2

L5 = [n[4] for n in data]  # n[4]表示第五列

print L5



# 將兩列資料生成二維矩陣

T = dict(zip(L2,L5))

"""zip函式:接受任意多個(包括0個和1個)序列作為引數,返回一個元組列表,

    再把元組列表以字典形式存在T中"""

print("T的型別" + str(type(T)))

print T



# dict類轉化為list

X = list(map(lambda x,y: (x,y),T.keys(),T.values()))

print("X的型別" + str(type(X)))

print X



# 匯入KMeans聚類相關模組

from sklearn.cluster import Birch

from sklearn.cluster import KMeans



clf = KMeans(n_clusters=3)

y_pred = clf.fit_predict(X)

# 輸出聚類結果,96行資料,每個y_pred對應X一行或一個球員,聚成3類,類標為0、1、2

print clf



# 視覺化繪圖

import numpy as np

import matplotlib.pyplot as plt



# 使用for迴圈獲取第一列和第二列資料

x = [n[0] for n in X]

print x

y = [n[1] for n in X]

print y



# 座標

x1 = []

y1 = []



x2 = []

y2 = []



x3 = []

y3 = []



# 分佈獲取類標0、1、2的資料,賦值給(x1,y1) (x2,y2) (x3,y3)

i = 0

while i < len(x):

    if y_pred[i] == 0:

        x1.append(X[i][0])

        y1.append(X[i][1])

    elif y_pred[i] == 1:

        x2.append(X[i][0])

        y2.append(X[i][1])

    elif y_pred[i] == 2:

        x3.append(X[i][0])

        y3.append(X[i][1])



    i = i + 1



# 四種顏色 紅 綠 藍 

plot1, = plt.plot(x1,y1,"or",marker="x")

plot2, = plt.plot(x2,y2,"og",marker="o")

plot3, = plt.plot(x3,y3,"ob",marker="*")



# 繪製標題

plt.title("Kmeans-Basketball Data")



# 繪製x軸和y軸座標

plt.xlabel("assists_per_minute")

plt.ylabel("points_per_minute")



# 設定右上角圖例

plt.legend((plot1,plot2,plot3),("A","B","C"),fontsize=10)



plt.show()

結果如下:
6626611-ceaff006155a22f3.png
圖片發自簡書App

從結果中可以看出:紅色部分助攻很少,得分卻很高,應該屬於得分後衛;而藍色部分處於中間部分,得分相比紅色部分低一點,但是助攻也有很多,應該屬於中鋒;綠色部分得分最少,助攻卻很多,這一部分球員應該屬於控衛。

相關文章