1. 场景描述

一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的K-means聚类算法,算法原理就不介绍了,只从代码层面进行介绍,包含:rest接口、连接mpp数据库、回传json数据、下载图片及数据。

2. 解决方案

2.1 项目套路

(1)python经典算法是单独的服务器部署,提供rest接口出来,供java平台调用,交互的方式是http+json;

(2)数据从mpp数据库-Greenplum中获取;

(3)返回的数据包括三个:1是生成聚类图片的地址;2是聚类项目完整数据地址;3是返回给前端的200条json预览数据。

2.2 restapi类

分两个类,第一个是restapi类,封装rest接口类,其他的经典算法在这里都有对应的方法,是个公共类。

完整代码:

  1. # -*- coding: utf-8 -*-
  2. from flask import Flask, request, send_from_directory
  3. from k_means import exec
  4. import logging
  5. app = Flask(__name__)
  6. #1.服务器上更改为服务器地址,用于存放数据
  7. dirpath = 'E:\\ruanjianlaowang'
  8. #2. 测试连通性,软件老王
  9. @app.route('/')
  10. def index():
  11. return "Hello, World!"
  12. #3. k-means算法 软件老王
  13. @app.route('/getKmeansInfoByLaowang', methods=['POST'])
  14. def getKmeansInfoByLaowang():
  15. try:
  16. result = exec(request.get_json(), dirpath)
  17. except IndexError as e:
  18. logging.error(str(e))
  19. return 'exception:' + str(e)
  20. except KeyError as e:
  21. logging.error(str(e))
  22. return 'exception:' + str(e)
  23. except ValueError as e:
  24. logging.error(str(e))
  25. return 'exception:' + str(e)
  26. except Exception as e:
  27. logging.error(str(e))
  28. return 'exception:' + str(e)
  29. else:
  30. return result
  31. #4.文件下载(图片及csv)
  32. @app.route("/<path:filename>")
  33. def getImages(filename):
  34. return send_from_directory(dirpath, filename, as_attachment=True)
  35. #5.启动
  36. if __name__ == '__main__':
  37. app.run(host="0.0.0.0", port=5000, debug=True)

代码说明:

使用的是第三方的flask提供的rest服务

(1)服务器上更改为服务器地址,用于存放数据

(2)测试连通性,软件老王

(3)k-means算法 软件老王

(4)文件下载(图片及csv)

(5)启动

2.3 k-means算法类

完整代码:

  1. import pandas as pd
  2. import dbgp as dbgp
  3. from pandas.io import json
  4. from numpy import *
  5. import matplotlib.pyplot as plt
  6. import numpy as np
  7. plt.switch_backend('agg')
  8. import logging
  9. # 执行 软件老王
  10. def exec(params, dirpath):
  11. #1.获取参数,软件老王
  12. sql = params.get("sql")
  13. xlines = params.get("xlines")
  14. ylines = params.get("ylines")
  15. xlinesname = params.get("xlinesname")
  16. ylinesname = params.get("ylinesname")
  17. grouplinesname = params.get("grouplinesname")
  18. times = int(params.get("times"))
  19. groupnum = int(params.get("groupnum"))
  20. url = params.get("url")
  21. name = params.get("name")
  22. #2. 校验是否为空,软件老王
  23. flag = checkparam(sql, xlines, ylines, times, groupnum)
  24. if not flag is None and len(flag) != 0:
  25. return flag
  26. #3. 从数据库获取数据,软件老王
  27. try:
  28. data = dbgp.queryGp(sql)
  29. except IndexError:
  30. return sql
  31. except KeyError:
  32. return sql
  33. except ValueError:
  34. return sql
  35. except Exception:
  36. return sql
  37. if data.empty:
  38. return "exception:此数据集无数据,请确认后重试"
  39. #4 调用第三方sklearn的KMeans聚类算法,软件老王
  40. # data_zs = 1.0 * (data - data.mean()) / data.std() 数据标准化,不需要标准话
  41. from sklearn.cluster import KMeans
  42. model = KMeans(n_clusters=groupnum, n_jobs=4, max_iter=times)
  43. model.fit(data) # 开始聚类
  44. return export(model, data, data, url, dirpath, name,grouplinesname,xlines, ylines,xlinesname,ylinesname)
  45. # 5.生成导出excel 软件老王
  46. def export(model, data, data_zs, url, dirpath, name,grouplinesname,xlines, ylines,xlinesname,ylinesname):
  47. # #详细输出原始数据及其类别
  48. detail_data = pd.DataFrame().append(data)
  49. if not grouplinesname is None and len(grouplinesname) != 0:
  50. detail_data.columns = grouplinesname.split(',')
  51. r_detail_new = pd.concat([detail_data, pd.Series(model.labels_, index=detail_data.index)], axis=1) # 详细输出每个样本对应的类别
  52. r_detail_new.columns = list(detail_data.columns) + [u'聚类类别'] # 重命名表头
  53. outputfile = dirpath + name + '.csv'
  54. r_detail_new.to_csv(outputfile, encoding='utf_8_sig') # 保存结果
  55. #重命名表头
  56. r1 = pd.Series(model.labels_).value_counts() # 统计各个类别的数目
  57. r2 = pd.DataFrame(model.cluster_centers_) # 找出聚类中心
  58. r = pd.concat([r2, r1], axis=1) # 横向连接(0是纵向),得到聚类中心对应的类别下的数目
  59. r.columns = list(data.columns) + [u'类别数目'] # 重命名表头
  60. return generateimage(r, data_zs, url, dirpath, name,model,xlines, ylines,xlinesname,ylinesname)
  61. #6.生成图片及返回json,软件老王
  62. def generateimage(r, data_zs, url, dirpath, name,model,xlines, ylines,xlinesname,ylinesname):
  63. image = dirpath + name + '.jpg'
  64. #6.1 中文处理,软件老王
  65. plt.rcParams['font.sans-serif'] = ['simhei']
  66. plt.rcParams['font.family'] = 'sans-serif'
  67. plt.rcParams['axes.unicode_minus'] = False
  68. # 6.2 画图,生成图片,软件老王
  69. labels = model.labels_
  70. centers = model.cluster_centers_
  71. data_zs['label'] = labels
  72. data_zs['label'] = data_zs['label'].astype(np.int)
  73. # 图标集合
  74. markers = ['o', 's', '+', 'x', '^', 'v', '<', '>']
  75. colors = ['b', 'c', 'g', 'k', 'm', 'r', 'y']
  76. symbols = []
  77. for m in markers:
  78. for c in colors:
  79. symbols.append((m, c))
  80. # 画每个类别的散点及质心
  81. for i in range(0, len(centers)):
  82. df_i = data_zs.loc[data_zs['label'] == i]
  83. symbol = symbols[i]
  84. center = centers[i]
  85. x = df_i[xlines].values.tolist()
  86. y = df_i[ylines].values.tolist()
  87. plt.scatter(x, y, marker=symbol[0], color=symbol[1], s=10)
  88. plt.scatter(center[0], center[1], marker='*', color=symbol[1], s=50)
  89. plt.title(name)
  90. plt.xlabel(xlinesname)
  91. plt.ylabel(ylinesname)
  92. plt.savefig(image, dpi=150)
  93. plt.clf()
  94. plt.close(0)
  95. # 6.3 返回json数据给前端展示,软件老王
  96. result = {}
  97. result['image_url'] = url + '/' + name + '.jpg'
  98. result['details_url'] = url + '/' + name + '.csv'
  99. result['data'] = r[:200] #显示200,多的话,相当于预览
  100. result = json.dumps(result, ensure_ascii=False)
  101. result = result.replace('\\', '')
  102. return result
  103. def checkparam(sql, xlines, ylines, times, groupnum):
  104. if sql is None or sql.strip() == '' or len(sql.strip()) == 0:
  105. return "数据集或聚类数据列,不能为空"
  106. if xlines is None or xlines.strip() == '' or len(xlines.strip()) == 0:
  107. return "X轴,不能为空"
  108. if ylines is None or ylines.strip() == '' or len(ylines.strip()) == 0:
  109. return "Y轴,不能为空"
  110. if times is None or times <= 0:
  111. return "聚类个数,不能为空或小于等于0"
  112. if groupnum is None or groupnum <= 0:
  113. return "迭代次数,不能为空或小于等于0"

代码说明:

(1)获取参数,软件老王;

(2)校验是否为空,软件老王;

(3)从数据库获取数据,软件老王;

(4)第三方sklearn的KMeans聚类算法,软件老王;

(5)生成导出excel 软件老王

(6)生成图片及返回json,软件老王

​ (6.1) 中文处理,软件老王

​ (6.2) 画图,生成图片,软件老王

​ (6.3) 返回json数据给前端展示,软件老王

2.4 执行效果

2.4.1 json返回
  1. {"image_url":"http://10.192.168.1:5000/ruanjianlaowang_65652.jpg","details_url":"http://10.192.168.1:5000/ruanjianlaowang_65652.csv","data":{"empno":{"0":7747.2,"1":7699.625,"2":7839.0},"mgr":{"0":7729.8,"1":7745.25,"2":7566.0},"sal":{"0":2855.0,"1":1218.75,"2":5000.0},"comm":{"0":29.5110766,"1":117.383964625,"2":31.281453},"deptno":{"0":20.0,"1":25.0,"2":10.0},"类别数目":{"0":5,"1":8,"2":1}}}
2.4.2 返回图片

2.4.3 返回的数据

另外说明: 目前项目环境上用的是8核16G的虚拟机,执行数据量是30万,运行状况良好。


I’m 「软件老王」,如果觉得还可以的话,关注下呗,后续更新秒知!欢迎讨论区、同名公众号留言交流!

python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)的更多相关文章

  1. python相关性算法解决方案(rest/数据库/json/下载)

    1. 场景描述 一直做java,因项目原因,需要封装一些经典的算法到平台上去,就一边学习python,一边网上寻找经典算法代码,今天介绍下经典的相关性算法,算法原理就不介绍了,只从代码层面进行介绍,包 ...

  2. python聚类算法实战详细笔记 (python3.6+(win10、Linux))

    python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念:     1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...

  3. Python聚类算法之基本K均值实例详解

    Python聚类算法之基本K均值实例详解 本文实例讲述了Python聚类算法之基本K均值运算技巧.分享给大家供大家参考,具体如下: 基本K均值 :选择 K 个初始质心,其中 K 是用户指定的参数,即所 ...

  4. python爬虫数据-下载图片经典案例

    '''Urllib 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据.首先,我们定义了一个getHtml()函数: urllib.urlopen()方法用于打开 ...

  5. Vue学习笔记十三:Vue+Bootstrap+vue-resource从接口获取数据库数据

    目录 前言 SpringBoot提供后端接口 Entity类 JPA操作接口 配置文件 数据库表自动映射,添加数据 写提供数据的接口 跨域问题 前端修改 效果图 待续 前言 Vue学习笔记九的列表案例 ...

  6. 机器学习(十)—聚类算法(KNN、Kmeans、密度聚类、层次聚类)

    聚类算法 任务:将数据集中的样本划分成若干个通常不相交的子集,对特征空间的一种划分. 性能度量:类内相似度高,类间相似度低.两大类:1.有参考标签,外部指标:2.无参照,内部指标. 距离计算:非负性, ...

  7. 机器学习Sklearn系列:(五)聚类算法

    K-means 原理 首先随机选择k个初始点作为质心 1. 对每一个样本点,计算得到距离其最近的质心,将其类别标记为该质心对应的类别 2. 使用归类好的样本点,重新计算K个类别的质心 3. 重复上述过 ...

  8. 机器学习:Python实现聚类算法(一)之AP算法

    1.算法简介 AP(Affinity Propagation)通常被翻译为近邻传播算法或者亲和力传播算法,是在2007年的Science杂志上提出的一种新的聚类算法.AP算法的基本思想是将全部数据点都 ...

  9. 机器学习:Python实现聚类算法(三)之总结

    考虑到学习知识的顺序及效率问题,所以后续的几种聚类方法不再详细讲解原理,也不再写python实现的源代码,只介绍下算法的基本思路,使大家对每种算法有个直观的印象,从而可以更好的理解函数中参数的意义及作 ...

随机推荐

  1. Golang 高效实践之defer、panic、recover实践

    前言 我们知道Golang处理异常是用error返回的方式,然后调用方根据error的值走不同的处理逻辑.但是,如果程序触发其他的严重异常,比如说数组越界,程序就要直接崩溃.Golang有没有一种异常 ...

  2. [leetcode] 392. Is Subsequence (Medium)

    原题 判断子序列 /** * @param {string} s * @param {string} t * @return {boolean} */ var isSubsequence = func ...

  3. WGAN的改进点和实操

    包含三部分:1.WGAN改进点  2.代码修改  3.训练心得 一.WGAN的改进部分: 判别器最后一层去掉sigmoid    (相当于最后一层做了一个y = x的激活) 生成器和判别器的loss不 ...

  4. 深挖Openstack Nova - Scheduler调度策略

    深挖Openstack Nova - Scheduler调度策略   一.  Scheduler的作用就是在创建实例(instance)时,为实例选择出合适的主机(host).这个过程分两步:过滤(F ...

  5. spark 源码分析之十九 -- Stage的提交

    引言 上篇 spark 源码分析之十九 -- DAG的生成和Stage的划分 中,主要介绍了下图中的前两个阶段DAG的构建和Stage的划分. 本篇文章主要剖析,Stage是如何提交的. rdd的依赖 ...

  6. 入门训练-1.A+B问题

    问题描述 输入A.B,输出A+B. 说明:在“问题描述”这部分,会给出试题的意思,以及所要求的目标. 输入格式 输入的第一行包括两个整数,由空格分隔,分别表示A.B. 说明:“输入格式”是描述在测试你 ...

  7. 第15个算法-实现 Trie (前缀树)(LeetCode)

    解法代码来源 :https://blog.csdn.net/whdAlive/article/details/81084793 算法来源:力扣(LeetCode)链接:https://leetcode ...

  8. (技能篇)双机热备之Oracle切换故障处理

    背景: 以前做的的一个项目中使用了某国产双机热备产品,但是在数据库做双机热备时出现了一些问题,没办法.不得不研究一番了!经过两天的研究终于问题得以解决.将问题处理步骤记录下来以备后用,也希望能帮助到需 ...

  9. 脱壳系列_0_FSG壳_详细版

    ---恢复内容开始--- 1 查看信息 使用ExeInfoPe查看此壳程序 可以看出是很老的FSG壳. 分析: Entry Point : 000000154,熟悉PE结构的知道,入口点(代码)揉进P ...

  10. cogs 1317. 数列操作C 区间修改 区间查询

    1317. 数列操作C ★★★   输入文件:shuliec.in   输出文件:shuliec.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 假设有一个长度为 n( ...