#无监督学习-聚类 K-means聚类算法
#以k为参数,把n个对象分为k个簇,使簇内具有较高相似度,簇间相似度较低
#1.随机选择k个点作为初始聚类中心;2.根据剩下点与聚类中心的距离(默认就是欧氏距离),归为最近的簇;
#3.对每个簇,计算所有点的均值作为新聚类中心;4.重复2、3直至聚类中心不变
#31省1999年平均每人全年支出,分为衣、食等八个变量,利用已有数据,对其进行聚类(对各城市消费等级进行分类)。
#技术路线:sklearn.cluster.Kmeans
#1.建立工程,导入sklearn相关包
import numpy as np
from sklearn.cluster import KMeans
#2.加载数据,创建K-means算法实例,并进行训练,获得标签
#加载数据方法定义
def loadData(filepath):
fr=open(filepath,'r+') #读写方式打开
lines=fr.readlines() #一行一行读入
retData=[]
retCityName=[]
for line in lines:
items=line.strip().split(',') #去掉文本中空格并拆分元素
retCityName.append(items[0]) #建立一个城市名称的列表[,,,...]
retData.append([float(items[i]) for i in range(1,len(items))])#建立一个二维列表,每个城市数据为一个内层列表[[],[],[]...]
return retData,retCityName
#主程序
if __name__=='__main__':
data,cityName=loadData("city.txt") #注意loadData的用法:会一行一行的处理数据,并分别返回响应值
#print(cityName,data)二者为列表类型
km=KMeans(n_clusters=3) #指定聚类中心个数(消费水平级数),默认最大迭代次数max_iter为300
label=km.fit_predict(data)#计算簇中心以及为簇分配序号,label为聚类后各数据所属的标签(不是簇中心值),data应为二维数组
expenses=np.sum(km.cluster_centers_,axis=1)#expense为聚类中心点数值结合,即平均消费水平
#km.cluster_centers_为按照label(=n_clusters)计算的簇中心值,axis=1为横向计算每个城市的总消费
print(expenses.sort(axis=0))#有三个元素,expenses为numpy.array类型,.sort确保expenses输出时按照升序排列
CityCluster=[[],[],[]]
for i in range(len(cityName)):
CityCluster[label[i]].append(cityName[i])#按照label类别将每个城市归到内层列表中
for i in range(len(CityCluster)):
print("Expenses:%.2f"% expenses[i]) #输出计算出的三个城市总开销簇中心
print(CityCluster[i])#输出对应簇包含的城市名称
无监督学习-聚类 K-means聚类算法
猜你喜欢
转载自blog.csdn.net/weixin_42183992/article/details/85319015
今日推荐
周排行