智能数据

from sklearn.cluster import MeanShift, estimate_bandwidth
## 将治愈率, 死亡率的数据单独取出来
locations = [[x,y] for x,y in zip(df['治愈率'].values.tolist(),df['死亡率'].values.tolist())]
locations = np.array(locations)
##带宽,也就是以某个点为核心时的搜索半径
## 这个是MeanShift 的带宽函数, locations是你的数据, quantile是指聚类的距离, 就是你## 上面写的半径的意思, n_samples 是样本的数量, 现在是使用50个样本来进行聚类
bandwidth = estimate_bandwidth(locations, quantile=0.2, n_samples=50)
##设置均值偏移函数
##这里就是MeanShift的使用步骤了, bandwidth 参数将你上面初始化好的那个带宽传进##去, 然后执行fit方法, 就是根据你这个带宽进行聚类训练
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
##训练数据
ms.fit(locations))
##每个点的分类标签
# 这里有6类, 分别是: 0, 1, 2, 3, 4, 5
labels = ms.labels_
print(labels)

##簇中心的点的集合
#这个是每个分类中心的点的位置
cluster_centers = ms.cluster_centers_
print('cluster_centers:',cluster_centers)


##总共的标签分类
#们知道 labels 存储的是你聚类出来的这些点的分类数据, 也可以叫分类的标签, #labels_unique = np.unique(labels) 就是将这些分类标签的重复数据去掉, 也就是取出标#签的集合, 这里操作完之后 labels_unique = [0, 1, 2, 3, 4, 5]
labels_unique = np.unique(labels)
##聚簇的个数,即分类的个数
#就把这6个分类的标签名称取出来
#n_clusters_ = len(labels_unique) 这段则是计算分类的数量, 这里等于6
n_clusters_ = len(labels_unique)
i = 1
# colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk') 这个是对颜色进行循环, 在plt.plot
# 这个画图函数里边颜色可以用字母来代替
# 这里因为只有6个分类, 所以下面的循环只取了 bgrcmy 这几个颜色, 分别用来渲染成下# 面效果图点点的颜色
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
# 这个循环中, 其实 k取到的值是 [0, 1, 2, 3, 4, 5], col 取到的值是 [b, g, r, c, m, y], 分别 
# 对应6种分类的标签, 以及6种分类的点点的颜色
for k, col in zip(range(n_clusters_), colors):
    ##根据lables中的值是否等于k,重新组成一个True、False的数组
    my_members = labels == k
    #取出当前分类的中心点(也就是聚类中心) 的数据值, 然后在改值的位置的点上面画一个黑色的圈圈
    cluster_center = cluster_centers[k]
    ##X[my_members, 0] 取出my_members对应位置为True的值的横坐标
    #取出 locations (死亡率, 治愈率数据的集合) 里的数据, 其中my_members = labels == k 是标记出当前所有分类的点的位置. 因为 labels 分类的数据是跟 locations 的数据的位置是一致的, 所以通过标记了当前了分类的数据位置, 就可以去locations 里将当前的分类数据取出来, locations[my_members, 0] 为取出当前分类中治愈率的数据, locations[my_members, 1] 为取出当前分类中死亡率的数据, 然后开始画点, 同时通过 col + '.' 指定点的颜色, markersize 指定点的大小
    plt.plot(locations[my_members, 0], locations[my_members, 1], col + '.', markersize=12)
    #这句代码的意思是在几个分类的中心点中画一个 颜色为 k 也就是黑色的圈圈
    #cluster_center[0] 为中心点的治愈率的值, cluster_center[1] 为中心点的死亡率的值, 'o' 是指画一个圈圈, markerfacecolor=col 这个是指那个点点的颜色, 这里跟上面画的点保持一样的颜色, markeredgecolor='k' 指画的圈圈是黑色的, markersize=10 指画的大小
    plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
             markeredgecolor='k', markersize=10)
             #这一句是指在中心点中标记出数字来, 其中 i 从一开始就赋值为 1, 然后每次循环都 + 1, 所以这里第一个分类的中心点回被标记个数字1, 第二个分类标记个数字2 ,以此类推
    plt.text(cluster_center[0], cluster_center[1],str(i))
    i += 1
plt.title('聚类簇数:{}'.format(n_clusters_))
plt.xlabel('治愈率')
plt.ylabel('死亡率')
plt.title('18240535王小雨')

df['类簇'] = labels

df.to_csv('cluster_res.csv', index=False, encoding='utf-8-sig')

plt.show()

你可能感兴趣的:(智能数据)