K-Means 算法

       在聚类中K-Means算法是很常用的一个算法,也是基于向量距离来做聚类。算法步骤如下。
      (1)从n个向量对象任意选择k个向量作为初始聚类中心。
      (2)根据在步骤(1)中设置的k个向量(中心对象向量),计算每个对象与这k个中心对象各自的距离。
      (3)对于步骤(2)中的计算,任何一个向量与这k个向量都有一个距离,有的远有的近,把这个向量和距离它最近的中心向量对象归在一个类簇中。
      (4)重新计算每个类簇的中心对象向量位置。
      (5)重复(3)(4)两个步骤,直到类簇聚类方案中的向量归类变化极少为止。例如,一次迭代后,只有少于1%的向量还在发生类簇之间的归类漂移,那么就可以认为分类完成。
      这里要注意的是:
      ①需要事先指定类簇的数量。
      ②需要事先给定初始的类中心。
      例如,先准备一个中国城市经纬度表,一共604个向量,这4个维度分别是(省,市,北纬,东经):
在这里插入图片描述
使用K-Means算法的代码如下:

# * coding:utf-8_*_
# 作者     :XiangLin
# 创建时间 :2019.12.28 11:32
# 文件     :K-means.py
# IDE      :PyCharm
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

#从磁盘读取城市经纬度数据
X = []
f = open('..\\data.txt')
for v in f:
    X.append([float(v.split(',')[2]),float(v.split(',')[3])])

#转换成numpy array
X = np.array(X)

print(X)

#类簇的数量
n_clusters = 5

#现在把数据和对应的分类数放入聚类函数中进行聚类
cls = KMeans(n_clusters).fit(X)

#X中每项所属分类的一个列表
cls.labels_

#画图
makers = ['^','x','o','*','+']
for i in range(n_clusters):
    members = cls.labels_ == i
    plt.scatter(X[members,0],X[members,1],s = 60 ,marker=makers[i],c='b',alpha=0.5)
plt.title('')
plt.show()

plt.scatter()浅解
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, *, data=None, **kwargs)

参数的解释:

x,y:表示的是大小为(n,)的数组,也就是我们即将绘制散点图的数据点

s:是一个实数或者是一个数组大小为(n,),这个是一个可选的参数。

c:表示的是颜色,也是一个可选项。默认是蓝色’b’,表示的是标记的颜色,或者可以是一个表示颜色的字符,或者是一个长度为n的表示颜色的序列等等,感觉还没用到过现在不解释了。但是c不可以是一个单独的RGB数字,也不可以是一个RGBA的序列。可以是他们的2维数组(只有一行)。

marker:表示的是标记的样式,默认的是’o’。

cmap:Colormap实体或者是一个colormap的名字,cmap仅仅当c是一个浮点数数组的时候才使用。如果没有申明就是image.cmap

norm:Normalize实体来将数据亮度转化到0-1之间,也是只有c是一个浮点数的数组的时候才使用。如果没有申明,就是默认为colors.Normalize。

vmin,vmax:实数,当norm存在的时候忽略。用来进行亮度数据的归一化。

alpha:实数,0-1之间。

linewidths:也就是标记点的长度。

绘出的图形如图所示。
图中的横坐标表示北纬维度,纵坐标表示东经维度。把中国的城市划分为5个大城市区域,在图上对应划分出东北、华中、华南、西部、西北5个区域。形状比较奇怪,像是沿着左下到右上的对角线“照了个镜子”,西北跑到了东南,东南跑到了西北。
在这里插入图片描述
数据链接:https://pan.baidu.com/s/1XU_Z46kF1JRhAGaZA2T5XA
提取码:0ubc

向林
2019年12月28日于长沙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值