中國mooc北京理工大學機器學習第一周(一)
阿新 • • 發佈:2017-05-18
lib odi pen 運行 numpy 聚類 準則 ++ mooc
從今天開始跟著北理工的老師走一遍sklearn,在這裏做筆記。
一、聚類
1、K-Means方法
先貼代碼,所有數據的下載地址:http://pan.baidu.com/s/1hrO5NW4
import numpy as np
from sklearn.cluster import KMeans
def loadData(filePath):#def一個讀取數據的loadData
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)#進行聚類,貼標簽,label=4
expenses = np.sum(km.cluster_centers_,axis=1)#expenses是每一個聚類容器的sum
CityCluster = [[],[],[],[]]#這裏的類別大於等於n_clusters
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])
1 sklearn.cluster.KMeans(
2 n_clusters=8,#你想分類的種類
3 init=‘k-means++‘,#初始簇中心的獲取方法
4 n_init=10,#獲取初始簇中心的更叠次數,為了彌補初始質心的影響,算法默認會初始10個質心,實現算法,然後返回最好的結果。
5 max_iter=300,#最大叠代次數
6 tol=0.0001,#容忍度,即kmeans運行準則收斂的條件
7 precompute_distances=‘auto‘, #是否需要提前計算距離
8 verbose=0,
9 random_state=None,
10 copy_x=True,
11 n_jobs=1, #並行設置
12 algorithm=‘auto‘ #kmeans的實現算法
13 )
總結一下:先讀取數據集合 ==> 構造聚類容器(分幾類) ==> 進行聚類貼標簽 ==> 根據貼好的標簽放到對應的聚類容器 ==> 計算中心值
暫時先了解這麽多,結合andrew和林軒田的機器學習課程知道,這裏Kmeans方法整個聚類的計算是先隨機選定聚類中心,不斷叠代修正,求向量和最小。
目前主要先掌握如何使用sklearn。
2、DBSCAN聚類算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪聲的基於密度的聚類方法。
由名字就可以知道他可以算出哪些離群點是噪音。
他和kmeans一個顯著的區別是他自動設置聚類的多少,需要人為調的參數是設定核心點的範圍。
2_1、數據的讀取與預處理
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] #A417314EEA7B onlinetime=int(line.split(‘,‘)[6]) #15 starttime=int(line.split(‘,‘)[4].split(‘ ‘)[1].split(‘:‘)[0])#22 if mac not in mac2id: mac2id[mac]=len(onlinetimes)#如果沒有出現過,直接append onlinetimes.append((starttime,onlinetime)) else: onlinetimes[mac2id[mac]]=[(starttime,onlinetime)]#出現過會替代(不太理解這,可能是數據的特點吧) real_X=np.array(onlinetimes).reshape((-1,2))#改成兩列(-1的含義是任意行)
2_2、DBSCAN聚類
X=real_X[:,0:1]#按照原形式讀取第一列 print(X) db=skc.DBSCAN(eps=0.01,min_samples=20).fit(X)#進行聚類,eps:半徑,min_samples:數據的個數 labels = db.labels_#貼標簽與取標簽 print(‘Labels:‘) print(labels) raito=len(labels[labels[:] == -1]) / len(labels)#-1為噪聲點 print(‘Noise raito:‘,format(raito, ‘.2%‘)) n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) #set的作用是去重復,然後減去噪聲 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()))#flatten方法:高維array和matrix轉化成1維。list不可用。 plt.hist(X,20) plt.show()
總結一下是這個課程老師上課講的很簡要,聚類一共講了大概30分鐘,但是很多細節需要自己下功夫百度,很不錯的課程。
之前學過andrew和林軒田的課程,結合這個看發現自己有很多沒掌握的地方。
抽時間回去看看。
以上:)
中國mooc北京理工大學機器學習第一周(一)