1. 程式人生 > >中國mooc北京理工大學機器學習第一周(一)

中國mooc北京理工大學機器學習第一周(一)

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北京理工大學機器學習第一周(一)