一起读代码_K-means-31省消费水平

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法

其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

聚类(clustering):就是根据数据的“相似性”将数据分为多类的过程。 评估两个不同样本之间的“相似性” ,通常使用的方法就是计算两个样本之间的“距离”。 使用不同的方法计算样本间的距离会关系到聚类结果的好坏。

样本间的距离计算常见的有:欧氏距离、曼哈顿距离、马氏距离、夹角余弦


一起读代码_K-means-31省消费水平


一起读代码_K-means-31省消费水平


一起读代码_K-means-31省消费水平


一起读代码_K-means-31省消费水平

我们需要用到的实验数据:


一起读代码_K-means-31省消费水平

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])

运行结果:


一起读代码_K-means-31省消费水平


分享到:


相關文章: