本程序是K均值聚类关于初始聚类中心选取的一种改进,原理来自于周志华的机器学习,这里只是尝试用python实现下。刚开始学习python,可能有问题大家觉得有用就借鉴下,如果哪里有问题还望指正。关于K均值聚类关于初始聚类中心选取的详细讨论我的博客另一篇文章详细介绍过,兴趣的可以去看看,这里只发我实现的python代码。

k均值代码参考来自于:# kmeans: k-means cluster
                                          # Author : zouxy
                                          # Date   : 2013-12-25
                                          # HomePage : http://blog.csdn.net/zouxy09
                                          # Email  : zouxy09@qq.com

main.py:

from centroids import *
from numpy import *
import time
import matplotlib.pyplot as plt## step 1: load data
print ("step 1: load data...")
dataSet = []
fileIn = open('data3.txt')
for line in fileIn.readlines():  #依次读取每行lineArr = line.strip().split('\t') #strip去掉每行头尾空白,对于每一行,#split('\t')按照制表符切割字符串,得到的结果构成一个数组,数组的每个元素代表一行中的一列。 dataSet.append([float(lineArr[0]), float(lineArr[1]), float(lineArr[2])])## step 2: clustering...
print ("step 2: clustering...")
#调用mat()函数可以将数组转换为矩阵,然后可以对矩阵进行一些线性代数的操作
dataSet = mat(dataSet)
k = 5
centroids, clusterAssment = kmeans(dataSet, k)## step 3: show the result
print ("step 3: show the result...")
showCluster(dataSet, k, centroids, clusterAssment)

centroids.py

#初始聚类中心改进算法
from numpy import *
import time
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# calculate Euclidean distance
def euclDistance(vector1, vector2):return sqrt(sum(power(vector2 - vector1, 2)))#平方,求和,开方# init centroids with random samples 随机初始质心
def initCentroids(dataSet, k):numSamples, dim = dataSet.shape#求行列数centroids = zeros((k, dim))#创建空矩阵,放初始点#第一个点index = int(random.uniform(0, numSamples))centroids[0, :] = dataSet[index, :]#第二个点A1=mat(zeros((numSamples, 1)))for i in range(numSamples):distance = euclDistance(centroids[0, :], dataSet[i, :])A1[i] = distancecentroids[1, :]= dataSet[nonzero(A1[:, 0] == max(A1))[0]]#第三个点及以后,#然后再选择距离前两个点的最短距离最大的那个点作为第三个初始类簇的中心点,j = 1while j<=k-2:mi = mat(zeros((numSamples, 1)))for i in range(numSamples):distance1 = euclDistance(centroids[j-1, :], dataSet[i-1, :])distance2 = euclDistance(centroids[j, :], dataSet[i-1, :])mi[i-1] = min([distance1,distance2])centroids[1+j, :]= dataSet[nonzero(mi[:, 0] == max(mi))[0]]j=j+1return centroids# k-means cluster
def kmeans(dataSet, k):numSamples = dataSet.shape[0]#行数# first column stores which cluster this sample belongs to,# second column stores the error between this sample and its centroidclusterAssment = mat(zeros((numSamples, 2)))clusterChanged = True## step 1: init centroidscentroids = initCentroids(dataSet, k)#调用初始化质心函数while clusterChanged:clusterChanged = False## for each samplefor i in range(numSamples):minDist  = 100000.0minIndex = 0## for each centroid## step 2: find the centroid who is closestfor j in range(k):distance = euclDistance(centroids[j, :], dataSet[i, :])#调用前面的函数if distance < minDist:minDist  = distanceminIndex = j## step 3: update its clusterif clusterAssment[i, 0] != minIndex:clusterChanged = TrueclusterAssment[i, :] = minIndex, minDist**2## step 4: update centroidsfor j in range(k):#找出每一类的点pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]]#clusterAssment[:, 0].A == j测试所有数据的类相同为true不同为false#nonzero()[0]把所有为true的位置写出来#pointsInCluster = dataSet[nonzero(clusterAssment[:, 0] == j)[0]]  .A的作用目前不清楚,不加也一样#求每一类的中心店centroids[j, :] = mean(pointsInCluster, axis = 0)print('Congratulations, cluster complete!')return centroids, clusterAssment# show your cluster only available with 3-D data
def showCluster(dataSet, k, centroids, clusterAssment):numSamples, dim = dataSet.shapeif dim > 3:print("Sorry! I can not draw because the dimension of your data is not 3!")return 1mark = ['r', 'g', 'b', 'y', 'm', 'k']if k > len(mark):print("Sorry! Your k is too large! please contact Zouxy")return 1fig = plt.figure()ax = plt.subplot(111, projection='3d')# draw all samplesfor i in range(numSamples):markIndex = int(clusterAssment[i, 0])ax.scatter(dataSet[i, 0], dataSet[i, 1], dataSet[i, 2], c=mark[markIndex], s=10)mark = ['r', 'b', 'g', 'k', 'm', 'y']# draw the centroidsfor i in range(k):ax.scatter(centroids[i, 0], centroids[i, 1], dataSet[i, 2], c=mark[3],s=100)#plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12)plt.show()

实验结果图多次尝试聚类正确率比随机初始化初始点得到的聚类结果正确率高多了。

 

K均值聚类关于初始聚类中心选取的一种改进(python程序)相关推荐

  1. K均值聚类关于初始聚类中心的探讨(matlab程序)

    对应之前发过的:K均值聚类关于初始聚类中心的探讨,补发MATLAB的程序代码. matlab程序: 1. %利用传统K均值随机选取点聚类 clear all; close all; clc; %生成五 ...

  2. 原创 | 一文读懂K均值(K-Means)聚类算法

    作者:王佳鑫审校:陈之炎本文约5800字,建议阅读10+分钟本文为你介绍经典的K-Means聚类算法. 概述 众所周知,机器学习算法可分为监督学习(Supervised learning)和无监督学习 ...

  3. 一文读懂K均值(K-Means)聚类算法

    作者:王佳鑫 审校:陈之炎 本文约5800字,建议阅读10+分钟本文为你介绍经典的K-Means聚类算法. 概述 众所周知,机器学习算法可分为监督学习(Supervised learning)和无监督 ...

  4. SPSS用KMEANS(K均值)、两阶段聚类、RFM模型在P2P网络金融研究借款人、出款人行为数据规律...

    全文下载链接:http://tecdat.cn/?p=27831 随着P2P网络金融平台的交易量的激增,其交易数据不能得到充分有效地利用.将聚类分析引入到P2P网络金融平台的管理之中,利用聚类分析技术 ...

  5. K均值聚类关于初始聚类中心的探讨

    摘要:进入二十一世纪以来,科学技术的不断发展,使得数据挖掘技术得到了学者越来越多的关注.数据挖掘是指从数据库中发现隐含在大量数据中的新颖的.潜在的有用信息和规则的过程,是一种处理数据库数据的知识发现. ...

  6. K均值(K-means)聚类算法

    文章目录 一. K-Means原理 二.算法流程 2.1 算法描述 2.2 算法分析: 2.3 k-means评价标准 2.4 k-means优缺点 三.项目实战 K-Means算法是经典的无监督的聚 ...

  7. 【论文阅读】基于自适应小生境和 k 均值操作的数据聚类差分进化算法

    文章目录 原文题目 摘要 I. 引言 背景知识 Niching(小生境) 适应度共享 参考文献 提出 Niching Method 的动机 Niching Method 需要 Adaptive 的动机 ...

  8. R实现K均值算法,层次聚类算法与DBSCAN算法

    1.聚类的基本概念 聚类分析(cluster analysis)仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组.其目标是,组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不 ...

  9. 基于K均值算法的鸢尾花聚类实验(Sklearn实现)

    实验代码 ##### 相关库导入部分 ##### from sklearn.datasets import load_iris import pandas as pd from sklearn.pre ...

最新文章

  1. 黑计算机学校给的处分,学校处分通告格式
  2. DotNetTextBoxV3.0在线编辑器控件Ver3.4.2 Open Source开源版
  3. go的25个关键字(保留字)和36个预定标识符
  4. 成为大厂AI算法工程师,“NLP/CV”都是你必须过的坎!
  5. 使用脚手架应用做单元测试
  6. csp-c模拟测试43「A·B·C」
  7. python猴子偷桃_Python实例100个(基于最新Python3.7版本)
  8. “升级 iOS 最新系统后,我弃用了 iPhone!”
  9. 忘记root密码后怎么解决?克隆虚拟机后如何实现两台linux相互登录?
  10. 使用Mongo Shell和Java驱动程序删除MongoDB的示例
  11. k3刷梅林5g信号不稳定_斐讯k3 5g信号不稳定 k3c路由器,现在还能入手吗?
  12. 注册github账号详细中文版教程【精选】
  13. HTML计算平均成绩,成绩平均分怎么算
  14. arm9芯片包括哪些?arm9如何应用?
  15. 图解汽车各部位的名称大全
  16. java中几种常用的对象类型(po,vo,bo,dto)
  17. Top,vmstat命令排查CPU使用率,负载问题
  18. spring--xml--constrructor-arg属性
  19. 医疗机构内新型冠状病毒感染预防与控制技术指南(第二版)
  20. 浅谈动感歌词-歌词生成篇

热门文章

  1. 28 SD配置-主数据-信用管理-定义信贷组
  2. linux中磁盘的iused,Linux 磁盘与文件系统管理
  3. cassandra可视化工具_耗时1个月整理!160种Python标准库、第三方库和外部工具都有了...
  4. 学术会议墙报_中国化学会第十四届全国电分析化学学术会议在南京顺利召开
  5. python爬虫基础扫盲之HTTP以及HTTPS
  6. koa上传文件处理403
  7. 训练集、验证集和测试集的意义
  8. shell脚本:实现文件覆盖写入、文件内容追加写入
  9. python cgi库_《Python 数据库 GUI CGI编程》
  10. eclipse新建的maven项目没有dependencies_Maven中dependencies与dependencyManagement的区别