由于需要海量的进行聚类,所以将 k-means 算法自我封装成一个方便利用的库,可以直接调用得到最优的 k值中心点

#!/usr/bin/python3.4
# -*- coding: utf-8 -*- # k-means算法 import numpy as np
from sklearn.cluster import KMeans
from sklearn import metrics def calckmean(array, karr):
# array是一个二维数组
# X = [[1, 2, 3, 4], [5, 6, 7, 8], [3, 4, 5, 6]] # k是待选取K值的数组
# karr = [2, 3, 4, 5, 8,...] # 将原始数据由数组变成矩阵 x = np.array(array) # 用来储存轮廓系数的数组
score = []
# 用来储存中心坐标点的数组
point = []
# 用来储存各个簇的坐标
coordinates = [] for k in karr:
kmeans_model = KMeans(n_clusters=k).fit(x)
# title = 'K = %s, 轮廓系数 = %.03f' % (k, metrics.silhouette_score(X, kmeans_model.labels))
# print(title) # 获取中心点的坐标
counter_point = kmeans_model.cluster_centers_
# print("k=" + str(k) + "时的中心点为" + "\n" + str(counter_point)) # 记录分数
# print(metrics.silhouette_score(x, kmeans_model.labels_,metric='euclidean'))
score.append("%.03f" % (metrics.silhouette_score(x, kmeans_model.labels_)))
# 记录中心坐标
point.append(counter_point) # 将坐标属于哪个簇的标签储存到数组
# k = 3 : [0 0 0 0 1 1 1 1 1 2 2 2 2 2]
# k = 4 : [1 1 1 1 0 0 0 0 0 3 2 2 3 2]
coordinates.append(kmeans_model.labels_) # 返回轮廓系数最大的k值\中心坐标\分簇坐标
maxscore = max(score, default=0) for i in range(0, len(score)):
if maxscore == score[i]:
# 储存分簇坐标的数组
coordinate = []
for j in range(0, len(point[i])):
temp = []
for item in zip(coordinates[i], array):
if item[0] == j:
temp.append(item[1])
coordinate.append(temp)
# 得到的样式为k=3,每个簇点的坐标群
# coordinate = [[[7, 1], [8, 2], [9, 1], [7, 1], [9, 3]],
# [[5, 8], [6, 6], [5, 7], [5, 6], [6, 7]],
# [[1, 1], [2, 3], [3, 2], [1, 2]]] return karr[i], point[i], coordinate

调用的时候直接可以:

from kmeans import *

测试数据:

#!/usr/bin/python3.4
# -*- coding: utf-8 -*- from kmeans import * x1 = np.array([1, 2, 3, 1, 5, 6, 5])
x2 = np.array([1, 3, 2, 2, 8, 6, 7]) # a = [[1, 2, 3, 1, 5, 6, 5], [1, 3, 2, 2, 8, 6, 7], [3, 5, 9, 4, 7, 6, 1], [1, 5, 3, 4, 8, 6, 7], [5, 1, 2, 3, 6, 9, 4],[8, 4, 6, 2, 1, 6, 3]]
a = [[1, 1], [2, 3], [3, 2], [1, 2], [5, 8], [6, 6], [5, 7], [5, 6], [6, 7], [7, 1], [8, 2], [9, 1], [7, 1], [9, 3]]
karr = [2, 3, 4, 5, 8]
# print(np.array(a))
# print(list(zip(x1, x2))) k, point = calckmean(a, karr)
print("最好的可以分成" + str(k) + "个簇,中心点为" + "\n" + str(point))

最新文章

  1. 数据集偏斜 - class skew problem - 以SVM松弛变量为例
  2. QFile QDataStream QTextStream
  3. .net 过滤特殊字符
  4. React Native 开发之 (04) 例子讲解
  5. VS2010 + Entity FrameWork 4.4 +Mvc 4.0 出现的错误
  6. AC自动机---Keywords Search
  7. c/c++----网站及其后门(CGI应用程序)
  8. Solr部署如何启动
  9. WCF 新手教程二
  10. python学习笔记3(字符串)
  11. Muduo-Base-Atomic
  12. 跟我学android-常用控件之EditText
  13. bzoj2719[Violet 4]银河之星
  14. Delphi控件的停靠功能
  15. ubuntu配置openvpn
  16. hdu-3790-最短路径问题(dijkstra算法)
  17. redis秒杀
  18. go generate 生成代码
  19. eclipse的基本使用和配置
  20. C# Modbus协议中读取浮点数的操作方法

热门文章

  1. Linux安装JSON-C
  2. Ansible入门篇:playbook的使用
  3. c++继承学习
  4. iOS 轻击、触摸和手势的检测
  5. 2016-3-1 Mac下使用Hexo搭建Blog
  6. 关于阿里ICON矢量图(SVG)上传问题.
  7. PHP通过get方法获得form表单数据方法总结
  8. Android SQLite数据库升级,怎么做(事物更改)
  9. ECS云服务器配置数据库远程链接
  10. git教程——安装配置