K-means聚类算法的应用

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

'''
@Author  :   {Jack Zhao}

@Time    :   2019/12/6 15:28

@Contact :   {[email protected]}

@Desc    :  聚类分析
'''
import os
import pandas as pd
from sklearn.cluster import KMeans #导入K均值聚类算法
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']    #指定默认字体 SimHei为黑体
plt.rcParams['axes.unicode_minus']=False   #用来正常显示负号
inputfile = './jiaoyi.xlsx'  # 待聚类的数据文件
outputfile = '../result/fenlei.xlsx'
k = 4  # 需要进行的聚类类别数
iteration = 50  # 聚类最大循环数

# 训练kmeans聚类模型
def kmeans(data):
    # 调用k-means算法,进行聚类分析
    kmodel = KMeans(n_clusters=k, n_jobs=2)  # n_jobs是并行数
    kmodel.fit(data)  # 训练模型
    print('正在聚类')
    r1 = pd.Series(kmodel.labels_).value_counts()  # 统计各个类别的数目
    r2 = pd.DataFrame(kmodel.cluster_centers_)  # 找出聚类中心
    return r1,r2,kmodel

def save_to_excel(r1,r2):
    r = pd.concat([r2, r1], axis=1)  # 横向连接(0是纵向),得到聚类中心对应的类别下的数目
    r.columns = list(data.columns) + [u'类别数目']  # 重命名表头
    print('聚类中心的客户数据及相关数目为:')
    print(r)
    print('输出分类结果到文件')
    r = pd.concat([data, pd.Series(kmodel.labels_, index=data.index)], axis=1)  # 详细输出每个样本对应的类别
    r.columns = list(data.columns) + [u'聚类类别']  # 重命名表头
    r.to_excel(outputfile)  # 保存分类结果
    return r,data

# 绘制饼图
def pie(r1):
    plt.pie(sorted(list(r1)), labels=['中端客户,常搞促销', '中高端客户,潜力股', '高端客户,需要VIP服务', '低端客户,维持现状'])
    plt.savefig('../result/q4.jpg')
    plt.show()




# 绘制概率密度图
def density_plot(data):
    p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
    [p[i].set_ylabel('density') for i in range(k)]
    plt.legend()
    plt.show()
    return plt




if __name__ == '__main__':
    # 读取数据并进行聚类分析
    data = pd.read_excel(inputfile)  # 读取数据
    r1,r2,kmodel = kmeans(data)
    # 存入excel文件
    r,data = save_to_excel(r1,r2)
    print('正在绘制概率密度图')
    # 绘制概率密度图
    pic_output = '../result/'  # 概率密度图文件名前缀
    for i in range(k):
        density_plot(data[r[u'聚类类别'] == i]).savefig(u'%s%s.png' % (pic_output, i))
    # 绘制饼图
    pie(r1)
    print('已完成')
    os.startfile('E:/test/decision1/result/fenlei.xlsx')





分类结果

发布了101 篇原创文章 · 获赞 46 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_40539952/article/details/103422941