无监督学习-聚类 K-means聚类算法

#无监督学习-聚类 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])#输出对应簇包含的城市名称
        

猜你喜欢

转载自blog.csdn.net/weixin_42183992/article/details/85319015