《机器学习实战》二分-kMeans算法(二分K均值聚类)

简介: =====================================================================《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记也包含一些其他python实现的机器学习算法                       ...

=====================================================================

《机器学习实战》系列博客是博主阅读《机器学习实战》这本书的笔记也包含一些其他python实现的机器学习算法
                                          算法实现均采用python

github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python

=====================================================================


Scikit-learn 实现的K-Means 算法请参考 :点击阅读

K-Means 均值算法请参考:点击阅读



首先二分-K均值是为了解决k-均值的用户自定义输入簇值k所延伸出来的自己判断k数目,其基本思路是:

为了得到k个簇,将所有点的集合分裂成两个簇,从这些簇中选取一个继续分裂,如此下去,直到产生k个簇。


伪代码:

初始化簇表,使之包含由所有的点组成的簇。
repeat
   从簇表中取出一个簇。
   {对选定的簇进行多次二分试验}
   for i=1 to 试验次数 do
       使用基本k均值,二分选定的簇。
   endfor
   从二分试验中选择具有最小误差的两个簇。
   将这两个簇添加到簇表中。
until 簇表中包含k个簇
比如要分成5个组,第一次分裂产生2个组,然后从这2个组中选一个目标函数产生的误差比较大的,分裂这个组产生2个,这样加上开始那1个就有3个组了,然后再从这3个组里选一个分裂,产生4个组,重复此过程,产生5个组。这算是一中基本求精的思想。二分k均值不太受初始化的困扰,因为它执行了多次二分试验并选取具有最小误差的试验结果,还因为每步只有两个质心。

优点与缺点

k均值简单并且可以用于各种数据类型,它相当有效,尽管常常多次运行。然后k均值并不适合所有的数据类型。它不能处理非球形簇,不同尺寸和不同密度的簇。对包含离群点(噪声点)的数据进行聚类时,k均值也有问题。

其实现的Python代码如下:

#encoding:utf-8
from numpy import *

def loadDataSet(filename):
	dataMat = []          #创建元祖
	fr = open(filename)
	for line in fr.readlines():
		curLine = line.strip().split("\t")
		fltLine = map(float,curLine) #使用map函数将curLine里的数全部转换为float型
		dataMat.append(fltLine)
	return dataMat

def distEclud(vecA,vecB):          #计算两个向量的欧式距离
	return sqrt(sum(power(vecA-vecB,2)))

def randCent(dataSet,k):            #位给定数据集构建一个包含k个随机质心的集合
	n = shape(dataSet)[1]   #shape函数此时返回的是dataSet元祖的列数
	centroids = mat(zeros((k,n)))       #mat函数创建k行n列的矩阵,centroids存放簇中心
	for j in range(n):
		minJ = min(dataSet[:,j])           #第j列的最小值
		rangeJ = float(max(dataSet[:,j]) - minJ)
		centroids[:,j] = minJ + rangeJ * random.rand(k,1)  #random.rand(k,1)产生shape(k,1)的矩阵
	return centroids

def kMeans(dataSet,k,disMeas = distEclud,createCent = randCent):
	m = shape(dataSet)[0] #shape函数此时返回的是dataSet元祖的行数
	clusterAssment = mat(zeros((m,2)))      #创建一个m行2列的矩阵,第一列存放索引值,第二列存放误差,误差用来评价聚类效果
	centroids = createCent(dataSet,k)  #创建k个质心,调用createCent()函数
	clusterChanged =True #标志变量,若为true则继续迭代
	print "质心位置更新过程变化:"
	while clusterChanged:
		clusterChanged = False
		for i in range(m):
			minDist = inf #inf为正无穷大
			minIndex = -1  #创建索引
			for j in range(k):
				#寻找最近的质心
				disJI = disMeas(centroids[j,:],dataSet[i,:]) #计算每个点到质心的欧氏距离
				if disJI< mindist="disJI" minindex="j" if="" clusterassment="" i="" minindex:="" clusterchanged="True" :="" print="" centroids="" for="" cent="" in="" range="" k="" ptsinclust="dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#通过数组过滤来获得给定簇的所有点" nonzero="" a="" eg="" b2="array([[True," false="" true="">(array([0, 0, 1]), array([0, 2, 0]))
				#print array(nonzero(b2))
				#=>[[0, 0, 1],[0, 2, 0]]
				centroids[cent,:] = mean(ptsInClust,axis=0)  #计算所有点的均值,选项axis=0表示沿矩阵的列方向进行均值计算
	return centroids,clusterAssment  #返回所有的类质心与点分配结果
	
def bikMeans(dataSet,k,disMeas = distEclud):
	m = shape(dataSet)[0] #shape函数此时返回的是dataSet元祖的行数
	clusterAssment = mat(zeros((m,2)))      #创建一个m行2列的矩阵,第一列存放索引值,第二列存放误差,误差用来评价聚类效果
	#创建一个初始簇
	centroid0 = mean(dataSet,axis=0).tolist()[0]
	centList = [centroid0]
	print centList
	print len(centList)
	for j in range(m):
		clusterAssment[j,1] = disMeas(mat(centroid0),dataSet[j,:])**2 #计算所有点的均值,选项axis=0表示沿矩阵的列方向进行均值计算
	while (len(centList)<k):
		lowestSSE = inf #inf正无穷大
		for i in range(len(centList)):
			#尝试划分每一簇
			ptsInCurrCluster = dataSet[nonzero(clusterAssment[:,0].A==i)[0],:]
			centroidMat,splitClustAss = kMeans(ptsInCurrCluster,2,disMeas)
			
			sseSplit = sum(splitClustAss[:,1])
			sseNotSplit = sum(clusterAssment[nonzero(clusterAssment[:,0].A!=i)[0],1])
			print "sseSplit and notSplit:",sseSplit,sseNotSplit
			if (sseSplit + sseNotSplit)<lowestSSE:
				bestCentToSplit = i
				bestNewCents = centroidMat
				bestClustAss = splitClustAss.copy()
				lowestSSE = sseSplit + sseNotSplit
		#更新簇的分配结果
		bestClustAss[nonzero(bestClustAss[:,0].A == 1)[0],0] = len(centList)
		bestClustAss[nonzero(bestClustAss[:,0].A == 0)[0],0] = bestCentToSplit
		
		print "the bestCentToSplit is :",bestCentToSplit
		print "the len of bestClustAss is:",len(bestClustAss)
		centList[bestCentToSplit] = bestNewCents[0,:]
		centList.append(bestNewCents[1,:])
		clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:] =bestClustAss
	return centList,clusterAssment
        #return mat(centList),clusterAssment

datMat = mat(loadDataSet('data.txt'))
myCentList,myNewAssment = bikMeans(datMat,2)
print "最终质心:\n",myCentList
print "索引值和均值:\n",myNewAssment
>

相关文章
|
1天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机(SVM)算法
【5月更文挑战第6天】在数据科学和人工智能的广阔天地中,支持向量机(SVM)以其强大的分类能力与理论深度成为机器学习领域中的一个闪亮的星。本文将深入探讨SVM的核心原理、关键特性以及实际应用案例,为读者提供一个清晰的视角来理解这一高级算法,并展示如何利用SVM解决实际问题。
19 7
|
1天前
|
机器学习/深度学习 人工智能 算法
探索机器学习中的支持向量机算法
【5月更文挑战第6天】 在数据科学和人工智能领域,支持向量机(SVM)是一种强大的监督学习模型,它凭借其出色的分类能力在众多机器学习任务中占据重要地位。本文旨在深入剖析支持向量机的工作原理,探讨其在高维数据处理中的优势以及面对大规模数据集时的应对策略。通过对核技巧、软间隔以及优化问题的讨论,我们将揭示SVM如何优雅地处理线性不可分问题,并保持模型的泛化性能。
|
5天前
|
机器学习/深度学习 自然语言处理 算法
机器学习算法原理与应用:深入探索与实战
【5月更文挑战第2天】本文深入探讨机器学习算法原理,包括监督学习(如线性回归、SVM、神经网络)、非监督学习(聚类、PCA)和强化学习。通过案例展示了机器学习在图像识别(CNN)、自然语言处理(RNN/LSTM)和推荐系统(协同过滤)的应用。随着技术发展,机器学习正广泛影响各领域,但也带来隐私和算法偏见问题,需关注解决。
|
6天前
|
机器学习/深度学习 运维 算法
【Python机器学习专栏】异常检测算法在Python中的实践
【4月更文挑战第30天】本文介绍了异常检测的重要性和在不同领域的应用,如欺诈检测和网络安全。文章概述了四种常见异常检测算法:基于统计、距离、密度和模型的方法。在Python实践中,使用scikit-learn库展示了如何实现这些算法,包括正态分布拟合、K-means聚类、局部异常因子(LOF)和孤立森林(Isolation Forest)。通过计算概率密度、距离、LOF值和数据点的平均路径长度来识别异常值。
|
7天前
|
机器学习/深度学习 数据可视化 算法
【Python机器学习专栏】t-SNE算法在数据可视化中的应用
【4月更文挑战第30天】t-SNE算法是用于高维数据可视化的非线性降维技术,通过最小化Kullback-Leibler散度在低维空间保持数据点间关系。其特点包括:高维到二维/三维映射、保留局部结构、无需预定义簇数量,但计算成本高。Python中可使用`scikit-learn`的`TSNE`类实现,结合`matplotlib`进行可视化。尽管计算昂贵,t-SNE在揭示复杂数据集结构上极具价值。
|
2月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
|
1月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
2月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
30 1
|
2月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
144 0
|
2月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
91 0