python实现K-means算法

k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。通过随机选取几个聚类中心,并计算所有点到中心的距离,选取最近的一类,在以这个簇为中心,求簇中点的均值形成新的类。

操作方法

  • 01

    第一步计算欧氏距离 并取样,k代表分类的总个数 import numpy as np #calculate the O distance def calculate_distance(vector1,vector2): import numpy as np return np.sqrt(np.sum(np.square(vector1-vector2))) #initialize centroids def initialize_centroids(data,k): import random return random.sample(data,k)

  • 02

    产生新的簇类并求出最短距离 #find the minimun diastance from individual to centroids def minimun_distance(data,centroidlist): clusterdictionary=cd=dict() for i in data: vector1=i marker=0 min_dist=float(inf) for j in range(len(centroidlist)): vector2=centroidlist[j] distance=calculate_distance(vector1,vector2) if distance<min_dist: min_dist=distance marker=j if marker not in clusterdictionary.keys(): clusterdictionary[marker]=list() clusterdictionary[marker].append(i) return clusterdictionary #get centroids def getcentroids(clusterdictionary): import numpy as np centroidlist=list() for key in clusterdictionary.keys(): centroid=np.mean(np.array(clusterdictionary[key]),axis=0) centroidlist.append(centroid) return np.array(centroidlist)

  • 03

    导入数据并计算,当簇中心变化小于一定阈值跳出循环 #get mean squared deviation def getmsd(clusterdictionary,centroidlist): sum=0.0 for key in clusterdictionary.keys(): vector1=centroidlist[key] distance=0.0 for i in clusterdictionary[key]: vector2=i distance+=calculate_distance(vector1,vector2) sum+=distance return sum #show result def showresult(clusterdictionary,centroidlist): import matplotlib.pyplot as plt colormark=['or','ob','og','ok'] centroidmark=['dr','db','dg','dk'] for key in clusterdictionary.keys(): plt.plot(centroidlist[key][0],centroidlist[key][1],centroidmark[key],markersize=12) for i in clusterdictionary[key]: plt.plot(i[0],i[1],colormark[key]) plt.show path='C:\\Users\\jyjh\\Desktop\\data.txt' data=open(path,'r').readlines() temp=list() import re for i in data: numlist=list() for j in i.strip().split('\t'): num=float(j) numlist.append(num) temp.append(numlist) data=np.array(temp) centroidlist=initialize_centroids(data,4) clusterdictionary=minimun_distance(data,centroidlist) new_msd=getmsd(clusterdictionary,centroidlist) old_msd=-0.000001 k=2 while(abs(new_msd-old_msd)>=0.00001): centroidlist=getcentroids(clusterdictionary) clusterdictionary=minimun_distance(data,centroidlist) old_msd=new_msd new_msd=getmsd(clusterdictionary,centroidlist) k+=1 print new_msd-old_msd showresult(clusterdictionary,centroidlist)

(0)

相关推荐

  • 使用notepad运行php,python的图文设置方法

    //网上转载了一篇是讲notepad++编译Python的文章,我一般主要是使用PHP的,其实原理完全一样! Notepad++ 是一个开源的文本编辑器,功能强大而且使用方便,一般情况下,Notepa ...

  • adb.exe是什么进程 adb.exe命令详解

    ADB全称Android Debug Bridge, 是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备(如G1手机). 它的主要功能有 ...

  • opencv多幅图像拼接算法(python 图像拼接)

    先来看看OpenCV官方的例子得到效果是非常的好,输入的images如下:效果:#Stitcher类与detail命名空间OpenCV提供了高级别的函数封装在Stitcher类中,使用很方便,不用考虑 ...

  • python冒泡排序算法怎么用

    冒泡排序是一次比较两个元素,只要满足排序要求就把他们交换过来直至将整个序列排好序,下面来看一下我们的详细方法 操作方法 01 首先我们打开电脑上的python软件,如图所示: 02 现在我们来定义冒泡 ...

  • Python图像高级滤波基于信息熵的算法

    图像处理是根据信息熵的方法来见局部滤波的一种方法,基本原理如下:求局部熵,熵是使用基为2的对数运算出来的.该函数将局部区域的灰度值分布进行二进制编码,返回编码的最小值.Python中有相关得到函数. ...

  • Java实现的几个常用排序算法详细解读

    排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料. 操作方法 01 1. 选择排序 选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要 ...

  • 手机YY耗流量怎样?手机YY语音使用流量情况及算法

    许多YY语音的忠实爱好者会在手机端也安装一个。问题就来了,大家都在担心手机YY语音会不会非常耗流量。下面小编来告诉大家手机YY语音使用流量情况以及算法。 手机yy语音安卓版下载http://www./ ...

  • Python与sed,grep文本查找效率对比小测

    Gnu awk作者在FreeBSD邮件列表中回答”GNU grep为什么比BSD grep要快“,提到了用到了Boyer-Moore算法,虽然不知道是什么,但感觉很厉害的样子~我猜想grep有多快呢? ...

  • 2014年9月百度绿萝算法再度升级

    2014年9月百度绿萝算法再度升级SEO需要跟随百度算法的调整应时而动,该算法主要打击超链中介、出卖链接、购买链接等超链作弊行为,这也是继百度在十月份推出的打击超链作弊算法后的升级更新,严厉打击了有链 ...