从今天开始跟着北理工的老师走一遍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和林轩田的课程,结合这个看发现自己有很多没掌握的地方。
抽时间回去看看。
以上:)
时间: 2024-10-18 03:23:44