8535.com-新浦京娱乐场官网|欢迎您

k-means聚类算法python实现,k-means聚类python

来源:http://www.dnamique.com 作者:计算机网络 人气:155 发布时间:2020-01-04
摘要:k-means聚类算法python完结,k-means聚类python K-means聚类算法 算法优劣势: 优点:轻易完成 缺欠:恐怕未有到一些最小值,在附近数据集上收敛很慢 使用数据类型:数值型数据 算法理念

k-means聚类算法python完结,k-means聚类python

K-means聚类算法

算法优劣势:

优点:轻易完成
缺欠:恐怕未有到一些最小值,在附近数据集上收敛很慢
使用数据类型:数值型数据

算法理念

k-means算法实际上正是经过测算不相仿本间的离开来判别他们的切近关系的,周围的就能停放同一个项目中去。

1.首先我们必要采纳三个k值,约等于大家盼望把多少分为多少类,这里k值的选料对结果的影响一点都不小,Ng的课说的精选方式有三种风华正茂种是elbow method,不问可以预知就是根据聚类的结果和k的函数关系判别k为多少的时候效果最佳。另大器晚成种则是依据实际的急需明确,举例说进行毛衣尺寸的聚类你大概就能够伪造分成三类(L,M,S)等

2.下一场大家须求接纳最早的聚类点(恐怕叫质心),这里的选料日常是任性筛选的,代码中的是在数码范围内大肆采取,另后生可畏种是自由筛选数据中的点。那么些点的接纳会超级大程度上海电影制片厂响到最后的结果,也正是说运气糟糕的话就到一些最小值去了。这里有二种管理方法,风流洒脱种是频仍取均值,另黄金时代种则是背后的改善算法(bisecting K-means)

3.归根结蒂大家开头步入正题了,接下去我们会把多少集中具备的点都简政放权下与那些质心的离开,把它们分到离它们质心如今的那意气风发类中去。完成后我们则必要将每一种簇算出平均值,用那几个点作为新的质心。反复重复这两步,直到收敛大家就赢得了最终的结果。

函数

loadDataSet(fileName)
从文件中读取数据集
distEclud(vecA, vecB)
计量间距,这里用的是欧氏间隔,当然其余合理的偏离都以足以的
randCent(dataSet, k)
自由变化开始的质心,这里是虽具采取数据范围内的点
kMeans(dataSet, k, distMeas=distEclud, createCent=randCent)
kmeans算法,输入数据和k值。前边八个事可选的相距总括方式和起来质心的抉择方式
show(dataSet, k, centroids, clusterAssment)
可视化结果

  1. 1 #coding=utf-8
    2 from numpy import *
    3 
    4 def loadDataSet(fileName):
    5     dataMat = []
    6     fr = open(fileName)
    7     for line in fr.readlines():
    8         curLine = line.strip().split('t')
    9         fltLine = map(float, curLine)
    
    10 dataMat.append(fltLine) 11 return dataMat 12
    13 #总计七个向量的离开,用的是欧几里得间隔 14 def distEclud(vecA, vecB卡塔尔: 15 return sqrt(sum(power(vecA - vecB, 2State of Qatar卡塔尔(قطر‎卡塔尔国 16 17 #随机生成早先的质心(ng的课说的初步情势是随机选K个点)
    18 def randCent(dataSet, k): 19 n = shape(dataSet)[1] 20 centroids = mat(zeros((k,n))) 21 for j in range(n): 22 minJ = min(dataSet[:,j]) 23 rangeJ = float(max(array(dataSet)[:,j]) - minJ) 24 centroids[:,j] = minJ + rangeJ * random.rand(k,1) 25 return centroids 26
    27 def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): 28 m = shape(dataSet)[0] 29 clusterAssment = mat(zeros((m,2)))#create mat to assign data points 30 #to a centroid, also holds SE of each point 31 centroids = createCent(dataSet, k) 32 clusterChanged = True 33 while clusterChanged: 34 clusterChanged = False 35 for i in range(m):#for each data point assign it to the closest centroid 36 minDist = inf 37 minIndex = -1 38 for j in range(k): 39 distJI = distMeas(centroids[j,:],dataSet[i,:]) 40 if distJI < minDist: 41 minDist = distJI; minIndex = j 42 if clusterAssment[i,0] != minIndex: 43 clusterChanged = True 44 clusterAssment[i,:] = minIndex,minDist**2 45 print centroids 46 for cent in range(k):#recalculate centroids 47 ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster 48 centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean 49 return centroids, clusterAssment 50
    51 def show(dataSet, k, centroids, clusterAssment): 52 from matplotlib import pyplot as plt
    53 numSamples, dim = dataSet.shape
    54 mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', ' 55 for i in xrange(numSamples):
    56 markIndex = int(clusterAssment[i, 0])
    57 plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])
    58 mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', ' 59 for i in range(k):
    60 plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12)
    61 plt.show() 62
    63 def main(): 64 dataMat = mat(loadDataSet('testSet.txt')) 65 myCentroids, clustAssing= kMeans(dataMat,4) 66 print myCentroids 67 show(dataMat, 4, myCentroids, clustAssing)
    68
    69
    70 if name == 'main': 71 main() 

此处是聚类结果,照旧很科学的啦 图片 1 然则有时候也会消失到部分最小值,仿佛上边那样,正是不幸收敛到有的最优了 图片 2      

起点为知笔记(Wiz卡塔尔

K-means聚类算法 算法优瑕玷: 优点:轻松完毕劣点:恐怕未有到一些最小值,在大范围数据集上收...

本文由8535.com-新浦京娱乐场官网|欢迎您发布于计算机网络,转载请注明出处:k-means聚类算法python实现,k-means聚类python

关键词:

最火资讯