大师兄的数据分析学习笔记(二十四):回归树与提升树
大师兄的数据分析学习笔记(二十六):聚类(二)
- 基于切割的K-means聚类算法。
- 基于层次的聚类算法。
- 基于密度的DBSCAN聚类算法。
- 基于图的Split聚类算法。
- 如何定义中心:取数据各维度的均值。
- 如何衡量距离:欧式距离方法
从n个样本中随机选取k个作为初始化的质心;
![]()
对每个样本测量其到每个质心的距离,并把它归到最近的质心的类;
![]()
重新计算已经得到的各个类的质心;
![]()
- 迭代2-3直到新的质心与原质心相等或小于指定阈值。
- 初始质心位置可能会影响最终聚类的结果。
解决:多次尝试,取最稳定的结果。- 个别离群值会影响整理聚类的效果。
![]()
解決:将取质心换成取中点(转换为K-Medoids算法)- 必须要指定K
解决:借鉴其它衡量因子辅助(如轮廓系数)
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>from sklearn.datasets import make_circles,make_blobs,make_moons
>>>from sklearn.cluster import KMeans
>>>n_samples = 1000
>>>circles = make_circles(n_samples=n_samples,factor=0.5,noise=0.05)
>>>moons = make_moons(n_samples=n_samples,noise=0.05)
>>>blobs = make_blobs(n_samples=n_samples,random_state=8)
>>>random_data = np.random.rand(n_samples,2),None
>>>colours = "bgrcmyk"
>>>data = [circles,moons,blobs,random_data]
>>>models = [("None",None),("Kmeans",KMeans(n_clusters=3))]
>>>fig = plt.figure()
>>>for inx,clt in enumerate(models):
>>> clt_name,clt_entity = clt
>>> for i,dataset in enumerate(data):
>>> X,Y = dataset
>>> if not clt_entity:
>>> clt_res = [0 for item in range(len(X))]
>>> else:
>>> clt_entity.fit(X)
>>> clt_res = clt_entity.labels_.astype(int)
>>> fig.add_subplot(len(models),len(data),inx*len(data)+i+1)
>>> plt.title(clt_name)
>>> [plt.scatter(X[p,0],X[p,1],color=colours[clt_res[p]]) for p in range(len(X))]
>>>plt.show()