中國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和林軒田的課程,結合這個看發現自己有很多沒掌握的地方。

抽時間回去看看。

以上:)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM