由于需要海量的进行聚类,所以将 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 # sklearn官方文档
# http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans
def calckmean(array, karr):
# array是一个二维数组
# X = X = [[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]] # k是待选取K值的数组
# karr = [2, 3, 4, 5, 8,...] # 将原始数据由数组变成矩阵 x = np.array(array) # 用来储存轮廓系数的数组
score = []
# 用来储存中心坐标点的数组
point = []
# 用来储存各个簇的坐标
coordinates = []
# 用来储存各个簇点的与中心的距离
distances = [] for k in karr:
# n_clusters为聚类的个数
# max_iter为迭代的次数,这里设置最大迭代次数为300
# n_init=10使用不同质心种子运行k-means算法的次数
kmeans_model = KMeans(n_clusters=k, max_iter=300,n_init=10).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 2 2 2 2 2 1 1 1 1 1]
# k = 4 : [1 1 1 1 0 0 0 0 0 3 2 2 3 2]
coordinates.append(kmeans_model.labels_) # 每个点和中心点的距离
distances.append(KMeans(n_clusters=k, max_iter=300).fit_transform(x)) # 返回轮廓系数最大的k值\中心坐标\分簇坐标
maxscore = max(score, default=0) for i in range(0, len(score)):
if maxscore == score[i]:
# 储存分簇坐标的数组
coordinate = []
# 储存簇点与中心点的距离数组
distance = []
for j in range(0, len(point[i])):
# 这里是得到分簇坐标
tempcoor = []
for item in zip(coordinates[i], array):
if item[0] == j:
tempcoor.append(item[1])
coordinate.append(tempcoor)
# 得到的样式为k=3,每个簇点的坐标群
# [[[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]]] # 这里是得到分簇与中心点的距离
tempdis = []
for item in zip(coordinates[i], distances[i]):
if item[0] == j:
tempdis.append(min(item[1]))
distance.append(tempdis)
# 得到k=3的各个簇点对中心的距离
# [[1.1661903789690597, 0.39999999999999575, 1.166190378969066, 1.1661903789690597, 1.7204650534085277],
# [1.2649110640673495, 0.9999999999999858, 0.4472135954999452, 0.8944271909999063, 0.6324555320336579],
# [1.25, 1.0307764064044151, 1.25, 0.75]] # 得到k=3的中心点
# [[8.0, 1.6],
# [5.4, 6.8],
# [1.75, 2.0]]
return karr[i], point[i], coordinate, distance

调用的时候直接可以:

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, coordinate, distance = calckmean(X, tests)
print("------------------------")
print("k=" + str(K) + "时的中心点为" + "\n" + str(point) + "\n" + "各个簇点为" + "\n" + str(coordinate))
print(distance)

源文件可以在我的github下载:

TTyb

sklearn的kmeans测试的更多相关文章

  1. 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...

  2. 3. sklearn的K-Means的使用

    1. K-Means原理解析 2. K-Means的优化 3. sklearn的K-Means的使用 4. K-Means和K-Means++实现 1. 前言 在机器学习中有几个重要的python学习 ...

  3. 利用sklearn实现k-means

    基于上面的一篇博客k-means利用sklearn实现k-means #!/usr/bin/env python # coding: utf-8 # In[1]: import numpy as np ...

  4. 【sklearn入门】通过sklearn实现k-means并可视化聚类结果

    import numpy as np from sklearn.cluster import KMeans from mpl_toolkits.mplot3d import Axes3D import ...

  5. Mahout 0.10.1安装(Hadoop2.6.0)及Kmeans测试

    1.版本和安装路径 Ubuntu 14.04 Mahout_Home=/opt/mahout-0.10.1 Hadoop_Home=/usr/local/hadoop Mavent_Home=/opt ...

  6. 第八次作业:聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    import numpy as np x = np.random.randint(1,100,[20,1]) y = np.zeros(20) k = 3 def initcenter(x,k): r ...

  7. K-means算法及文本聚类实践

    K-Means是常用的聚类算法,与其他聚类算法相比,其时间复杂度低,聚类的效果也还不错,这里简单介绍一下k-means算法,下图是一个手写体数据集聚类的结果. 基本思想 k-means算法需要事先指定 ...

  8. 一步步教你轻松学K-means聚类算法

    一步步教你轻松学K-means聚类算法(白宁超  2018年9月13日09:10:33) 导读:k-均值算法(英文:k-means clustering),属于比较常用的算法之一,文本首先介绍聚类的理 ...

  9. 1. K-Means原理解析

    1. K-Means原理解析 2. K-Means的优化 3. sklearn的K-Means的使用 4. K-Means和K-Means++实现 1. 前言 我们在一开始的时候应该就说过,机器学习按 ...

随机推荐

  1. 《ServerSuperIO Designer IDE使用教程》-4.增加台达PLC驱动及使用教程,从0到1的改变。发布:v4.2.3版本

    v4.2.3 更新内容:1.优化数据存储部分,提高效率.2.修复数据库服务停止造成程序异常退出的现象.3.修复本机没有串口造成无法增加设备驱动的情况.4.增加编辑设备和监测点配置信息功能.5.增加台达 ...

  2. 将最小的OWIN身份验证添加到现有的ASP.NET MVC应用程序

    https://weblog.west-wind.com/posts/2015/Apr/29/Adding-minimal-OWIN-Identity-Authentication-to-an-Exi ...

  3. IE外挂

    //引用 Windows/system32/Shell32.dll //引用COM组件 shdocvw.dll (Microsoft Internet Controls) //引用COM组件 msht ...

  4. tomcat指定运行jdk

    set JAVA_HOME=D:\Program Files\Java\jdk7\jdk1.7.0_51 set JRE_HOME=D:\Program Files\Java\jdk7\jre7路径根 ...

  5. [sublime]用sublime搭建属于自己的Python的IDE

    先在sublime中利用package control下载anaconda插件, 然后更改python的路径,不知道自己anaconda的python在哪,可以在prompt用命令where pyth ...

  6. HashCode总结

    不同的实例对象的hashCode是不相同的 package com.cici.test;class DoubleLinkNode{ public int iData; public double dD ...

  7. 一、OpenStack环境准备及共享组件安装

    一.OpenStack部署环境准备: 1.关闭防火墙所有虚拟机都要操作 # setenforce 0 # systemctl stop firewalld 2.域名解析所有虚拟机都要操作 # cat ...

  8. Java中的异步通知

    在我们的日常开发中,经常会遇到这样的问题--"我让你做一件事情,但是你做得很慢,并不能够立马返回给我结果,害我一直在那儿等着你给我返回结果,什么都做不了". 程序是自上而下顺序执行 ...

  9. RSP小组——团队冲刺博客四

    RSP小组--团队冲刺博客四 冲刺日期:2018年12月13日 前言 问题已经明确,经过今天的努力,部分已近得到解决,所以,今天是一个值得庆祝的日子. 各成员今日(12.13)完成的任务 李闻洲对音乐 ...

  10. Hive与Hbase整合

    Hive与Hbase整合 1.文档 Hive HBase Integration 2.拷贝jar文件 2.1.把Hbase的lib目录下面的jar文件全部拷贝到Hive的lib目录下面 cd /hom ...