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')