美文网首页
基于K-means聚类算法对相关数据进行分析

基于K-means聚类算法对相关数据进行分析

作者: Acamy丶 | 来源:发表于2017-12-06 20:14 被阅读0次

    k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似
    度,而簇间的相似度较低。本文主要基于此算法对下图2006年各地区城镇居民家庭平均每人全年消费性支出进行分析,以了解各地消费层级的划分

    实现代码如下:

    import numpy as np
    from sklearn.cluster import KMeans
    import openpyxl
     
    def loadData(filePath):
        wb = openpyxl.load_workbook(filePath)
        sh = wb.get_sheet_by_name('Sheet1')
        retData = []
        retCityName = []
        for i in range(5, sh.max_row + 1):
            retCityName.append(sh.cell(row=i, column=1).value)
            retData.append([float(sh.cell(row=i, column=j).value) for j in range(2,sh.max_column + 1)])
        return retData,retCityName 
         
    if __name__ == '__main__':
        data,cityName = loadData('city.xlsx')
        km = KMeans(n_clusters=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])
    

    首先通过openpyxl类库来读取Excel中的文件,将城市名称和其它数据分别存入一个一维数据和二维数组中,然后调用KMeans方法,设置n_clusters参数,即分类个数,对数据时行训练,获得标签,最后对标签进行输出。输出结果即将城市按照消费水平n_clusters类,消费水平相近的城市聚集在一类中。其中expense为聚类中心点的数值加和,也就是平均消费水平。
    当n_clusters=2时:

    Expenses:7595.47
    [' 天  津', ' 河  北', ' 山  西', ' 内蒙古', ' 辽  宁', ' 吉  林', ' 黑龙江', ' 江  苏', ' 安  徽', ' 福  建', ' 江  西', ' 山  东', ' 河  南', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 重  庆', ' 四  川', ' 贵  州', ' 云  南', ' 西  藏', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']
    Expenses:13841.98
    [' 北  京', ' 上  海', ' 浙  江', ' 广  东']
    

    当n_clusters=3时:

    Expenses:7204.11
    [' 河  北', ' 山  西', ' 内蒙古', ' 辽  宁', ' 吉  林', ' 黑龙江', ' 安  徽', ' 江  西', ' 山  东', ' 河  南', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 四  川', ' 贵  州', ' 云  南', ' 西  藏', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']
    Expenses:13841.98
    [' 北  京', ' 上  海', ' 浙  江', ' 广  东']
    Expenses:9845.76
    [' 天  津', ' 江  苏', ' 福  建', ' 重  庆']
    

    当n_clusters=4时:

    Expenses:7214.42
    [' 辽  宁', ' 安  徽', ' 江  西', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 四  川', ' 贵  州', ' 云  南', ' 西  藏']
    Expenses:13841.98
    [' 北  京', ' 上  海', ' 浙  江', ' 广  东']
    Expenses:9845.76
    [' 天  津', ' 江  苏', ' 福  建', ' 重  庆']
    Expenses:7194.66
    [' 河  北', ' 山  西', ' 内蒙古', ' 吉  林', ' 黑龙江', ' 山  东', ' 河  南', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']
    

    当n_clusters=5时:

    Expenses:9845.76
    [' 天  津', ' 江  苏', ' 福  建', ' 重  庆']
    Expenses:7130.70
    [' 河  北', ' 山  西', ' 内蒙古', ' 吉  林', ' 黑龙江', ' 江  西', ' 山  东', ' 河  南', ' 贵  州', ' 陕  西', ' 甘  肃', ' 青  海', ' 宁  夏', ' 新  疆']
    Expenses:12890.38
    [' 浙  江', ' 广  东']
    Expenses:7318.30
    [' 辽  宁', ' 安  徽', ' 湖  北', ' 湖  南', ' 广  西', ' 海  南', ' 四  川', ' 云  南', ' 西  藏']
    Expenses:14793.59
    [' 北  京', ' 上  海']
    

    从结果可以看出消费水平相近的省市聚集在了一类,例如聚4类时,消费最高的' 北 京', ' 上 海', ' 浙 江', ' 广 东'聚集在了消费最高的类别,结果可以比较明显的看出消费层级。

    相关文章

      网友评论

          本文标题:基于K-means聚类算法对相关数据进行分析

          本文链接:https://www.haomeiwen.com/subject/ohilixtx.html