Python機器學習應用(中國mooc)-摘2

K-means聚類算法:

k-means算法以k爲參數,把n個對象分成k個簇,使簇內具有較高的相似度,而簇間的相似度較低。
其處理過程如下:
1.隨機選擇k個點作爲初始的聚類中心;
2.對於剩下的點,根據其與聚類中心的距離,將其歸入最近的簇。
3.對每個簇,計算所有點的均值作爲新的聚類中心。
4.重複2、3直到聚類中心不再發生改變。

 

K-means 的應用:

數據介紹:
現有 1999 年全國 31 個省份城鎮居民家庭平均每人全年消費性支出的八個主要變量數據,這八個變量分別是:食品 、衣着 、家庭設備用品及服務、醫療保健 、交通和通訊 、娛樂教育文化服務、居住以及雜項商品和服務。利用已有數據 ,對31 個省份進行聚類 。
實驗目的:
通過聚類,瞭解1999年各個省份的消費水平在國內的情況。

 

實現過程:

1.建立工程,導入sklearn相關包

import numpy as np
from sklearn.cluster import KMeans

2.加載數據,創建K-means算法實例,並進行訓練,獲得標籤:

import numpy as np
from sklearn.cluster import KMeans
 
 
def loadData(filePath):
    fr = open(filePath,'r+')
    lines = fr.readlines()
    retData = []
    retCityName = []
    for line in lines:
        items = line.strip().split(",")
        retCityName.append(items[0])
        retData.append([float(items[i]) for i in range(1,len(items))])
    return retData,retCityName
 
     
if __name__ == '__main__':
    data,cityName = loadData('city.txt')
    km = KMeans(n_clusters=4)
    label = km.fit_predict(data)
    expenses = np.sum(km.cluster_centers_,axis=1)
    #print(expenses)
    CityCluster = [[],[],[],[]]
    for i in range(len(cityName)):
        CityCluster[label[i]].append(cityName[i])
    for i in range(len(CityCluster)):
        print("Expenses:%.2f" % expenses[i])
        print(CityCluster[i])

if __name__ == '__main__'如何理解:

__name__ 是當前模塊名,當模塊被直接運行時模塊名爲 __main__ 。這句話的意思就是,當模塊被直接運行時,以下代碼塊將被運行,當模塊是被導入時,代碼塊不被運行。

 

 

3.輸出標籤,查看結果
將城市按照消費水平n_clusters類,消費水平相近的城市聚集在一類中。
expense:聚類中心點的數值加和,也就是平均消費水平。

聚成2類: km=KMeans(n_clusters=2)

聚成3類: km=KMeans(n_clusters=3)

聚成4類: km=KMeans(n_clusters=4)

從結果可以看出消費水平相近的省市聚集在了一類,例如消費最高的“北京”、“上海”、“廣東”聚集在了消費最高的類別。聚4類時,結果可以比較明顯地看出消費層級。
 

 

DBSCAN密度聚類:

DBSCAN算法是一種基於密度的聚類算法:
聚類的時候不需要預先指定簇的個數;
最終的簇的個數不定。

 

DBSCAN算法將數據點分爲三類:

核心點:在半徑Eps內含有超過MinPts數目的點;
邊界點:在半徑Eps內點的數量小於MinPts,但是落在覈心點的鄰域內;
噪音點:既不是核心點也不是邊界點的點。
 

 

DBSCAN算法流程:

1.將所有點標記爲核心點、邊界點或噪聲點;
2.刪除噪聲點;
3.爲距離在Eps之內的所有核心點之間賦予一條邊;
4.每組連通的核心點形成一個簇;
5.將每個邊界點指派到一個與之關聯的核心點的簇中(哪一個核心點的半徑範圍之內)

 

DBSCAN的應用實例:

數據介紹:
現有大學校園網的日誌數據,290條大學生的校園網使用情況數據,數據包括用戶ID,設備的MAC地址,IP地址,開始上網時間,停止上網時間,上網時長,校園網套餐等。利用已有數據,分析學生上網的模式。
實驗目的:
通過DBSCAN聚類,分析學生上網時間和上網時長的模式。

 

import numpy as np
import sklearn.cluster as skc
from sklearn import metrics
import matplotlib.pyplot as plt
 
 
mac2id=dict()
onlinetimes=[]
f=open('TestData.txt',encoding='utf-8')
for line in f:
    mac=line.split(',')[2]
    onlinetime=int(line.split(',')[6])
    starttime=int(line.split(',')[4].split(' ')[1].split(':')[0])
    if mac not in mac2id:
        mac2id[mac]=len(onlinetimes)
        onlinetimes.append((starttime,onlinetime))
    else:
        onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]
real_X=np.array(onlinetimes).reshape((-1,2))
 
X=real_X[:,0:1]
 
db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X)
labels = db.labels_
 
print('Labels:')
print(labels)
raito=len(labels[labels[:] == -1]) / len(labels)
print('Noise raito:',format(raito, '.2%'))
 
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
 
print('Estimated number of clusters: %d' % n_clusters_)
print("Silhouette Coefficient: %0.3f"% metrics.silhouette_score(X, labels))
 
for i in range(n_clusters_):
    print('Cluster ',i,':')
    print(list(X[labels == i].flatten()))
     
plt.hist(X,24)

 

1.建立工程,導入sklearn相關包

import numpy as np
from sklearn.cluster import DBSCAN

DBSCAN主要參數:
eps:兩個樣本被看作鄰居節點的最大距離;
min_samples:簇的樣本數;
metric:距離計算方式;

例:sklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric='education')

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章