k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法
其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
聚类(clustering):就是根据数据的“相似性”将数据分为多类的过程。 评估两个不同样本之间的“相似性” ,通常使用的方法就是计算两个样本之间的“距离”。 使用不同的方法计算样本间的距离会关系到聚类结果的好坏。
样本间的距离计算常见的有:欧氏距离、曼哈顿距离、马氏距离、夹角余弦
我们需要用到的实验数据:
python代码详细解读:
import numpy as np
from sklearn.cluster import KMeans
def loaddata(filepath): #定义一个数据加载函数,输入值为文件路径,返回值为各类数据和对应省份名字
fr=open(filepath,'r')#以只读方式打开
lines=fr.readlines()#读取所有行
retdata=[]
retcityname=[]
for line in lines:
items=line.strip().split(",")#将读取的数据删去换行符'\\n',并用逗号分隔开
retcityname.append(items[0])#将第一项(城市名)添加到数组retcityname中
retdata.append([float(items[i])for i in range(1,len(items))])#将同一行内剩余数据依次添加到retdata中,需要注意使用float[]进行类型转化从而达到运算浮点数而不是字符型变量#
return retdata,retcityname
if __name__=='__main__':
data,cityname=loaddata('31省市居民家庭消费水平-city.txt')
km=KMeans(n_clusters=4)#创建kmeans分类器,指定聚类中心个数(分类类别数)为4#
label=km.fit_predict(data)#计算簇中心以及为簇分配序号
expenses=np.sum(km.cluster_centers_,axis=1)#聚类中心数据求和,求和方式为按行相加#
print(expenses)
CityCluster=[[],[],[],[]]#四类对应四组数据
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])
运行结果:
閱讀更多 這裡有個小樂 的文章