用代码聊算法之k-means算法
来源:互联网 发布:mysql登录密码设置密码 编辑:程序博客网 时间:2024/06/06 02:40
一、简介
k-means是一种常见的无监督机器学习算法,众所周知,无监督学习的分类往往是需要先聚类再分类的,而k-means算法就是最常见,使用频率最高的聚类算法。其核心思想是把一些未标注的数据(无标签)分类称为k类不相同的簇中(cluster),算法k-means名称中的k就是所分成的簇的数量。而同一簇之中的对象都是有某些相似之处,当簇中的点越相似,我们的分类效果就越好。每个簇的中心点是由该簇所有点的欧氏距离的平均值计算而成,因此也就得名means。
k-means除了应用在对无标签的数据进行聚类分类之外,也常常应用于有监督学习进行训练之前的对数据集特征的探索和表征。
k-means算法中的k一般是手动指定的,换句话说k是算法的输入,稍后我们会讨论如何不指定k值的情况下开始我们的算法。
二、数学表示
三、代码
def distEclud(vecA,vecB): return np.sqrt(sum(vecA-vecB,2))
def randCent(dataSet,k=2): n=np.shape(dataSet)[1] centroids=np.matrix(np.zeros(n,k)) for j in range(n): minJ=min(dataSet[:,j]) rangeJ=float(max(dataSet[:,j])-minJ) centroids[:,j]=minJ+rangeJ*np.random.rand(k,1) return centroids
def kmeans (dataSet,k=2,distMess=distEclud,createCent=randCent): m=np.shape(dataSet)[0] clusterAssment = np.mat(np.zeros((m,2))) centroids=createCent(dataSet,k) clusterChanged = True while clusterChanged: clusterChanged = False for i in range(m): minDist = np.inf; minIndex = -1; for j in range(k): distJI=distMess(centroids[j,:],dataSet[i,:]) if distJI<minDist: # 寻找最近的质心 minDist=distJI;minIndex=j if clusterAssment[i,0] != minIndex: clusterChanged = True clusterAssment[i,:] = minIndex,minDist**2 print(centroids) for cent in range(k): # 更新质心的位置 ptsInClust = dataSet[np.nonzero()] centroids[cent,:]=np.mean(ptsInClust,axis=0) return centroids,clusterAssment
四、实现
上面的python代码是参考《机器学习实战》一书写出的代码,但是在实际工作之中,我们更多的是使用scikit-learn提供的k-means算法,scikit-learn是一个在机器学习领域被广泛应用的科学计算工具包,该项目最早由数据科学家 David Cournapeau 在2007 年发起,需要NumPy和SciPy等其他包的支持,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。
下面贴出scikit-learn的k-means示例代码[2]:
>>> from sklearn.cluster import KMeans>>> import numpy as np>>> X = np.array([[1, 2], [1, 4], [1, 0],... [4, 2], [4, 4], [4, 0]])>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)>>> kmeans.labels_array([0, 0, 0, 1, 1, 1], dtype=int32)>>> kmeans.predict([[0, 0], [4, 4]])array([0, 1], dtype=int32)>>> kmeans.cluster_centers_array([[ 1., 2.], [ 4., 2.]])
scikit-learn的sklearn.cluster提供了一个完整的k-means算法的实现KMeans,其中参数的含义如下:
1、n_clusters:k值,即聚类簇的数量,该值默认值是8
2、max_iter:每次执行k-means算法单次最大循环次数,即终止条件,以防止迭代次数过多循环仍不结束,在最优解附近徘徊的情况,该值也是可选的,默认值300
3、n_init:随机生成质心最大次数,由于初始质心是随机生成的,每次生成有可能效果不好,故应循环n次,取效果最好的一次结果最为随机质心,该值默认值是10
4、init: 初始点的默认生成方法,可以选择"k-means++","random"或者是一个ndarray,默认初始化方法是"k-means++"方法,关于"k-means++"的初始化方法我们会在下面优化的部分进一步描述
5、copy_x:对数据进行处理时,是否复制,若True,则会复制一份数据处理,反之则会在原数据上进行处理,默认值是True
除此之外还有algorithm、precompute_distances、tol、n_jobs、random_state、verbose等参数,对于本文讨论的算法原理关系不是很大,有兴趣的朋友可以点击这里自行了解。
调用了KMeans()方法之后,就可以进一步调用Kmeans模块的其他方法了,诸如:
1、fit(X[,y])方法:计算X的聚类(簇)中心,其中X是传入的矩阵(matrix或ndarray,矩阵的行是数据,列是特征),y是可省略的标签,默认值是none
2、fit_predict(X[,y])方法:对数据X进行聚类,并对X中每一条数据进行分类,相当于对X调用fit()方法,再调用label()方法
3、fit_transform(X[,y])方法:对数据X进行聚类,返回聚类中心距离矩阵(返回矩阵的每一行都是数据X中所有点到k个中心点的距离),该方法等同于调用fit().translate()方法
4、get_params()方法:可返回KMeans()方法中设定的参数
5、predict()方法:预测方法,可预测新数据属于哪一类,要求输入的数据是一个拥有相同特征数的matrix、ndarry或list
对于返回的结果kmeans,则有如下几个属性:
1、cluster_centers_:聚类中心点坐标,会返回k个数组,每个数组对应一类聚类中心点
2、labels_ :每个数据的标签,这些数据在最终的训练结果会被分为k个不同的类别(簇),而这个ndarray则会返回每一行数据对应的标签
3、inertia_:数据库中每个点到它对应的聚类中心的点的距离之和,可用来衡量分类的好坏
五 、优化
对于k的数量的选择,有一个经典的方法叫“肘部法则”,Andrew教授的视频有详细的叙述,在此我大概复述如下:
- 用代码聊算法之k-means算法
- k-means算法代码
- K-means算法JAVA代码
- 机器学习之K-means算法:深入浅出K-Means算法
- K-means聚类算法Matlab代码
- K-Means算法和实现代码
- k-means算法MATLAB和opencv代码
- k-means算法MATLAB和opencv代码
- 聚类算法之K-means
- 聚类算法之K-means
- 聚类算法之K-MEANS
- Weka -- 聚类算法之K-means
- 聚类算法 之 k-means
- Mahout之k-means算法源码分析
- 机器学习算法 之 K-Means聚类
- 图像处理之K-Means算法演示
- 机器学习之K-means算法
- 聚类算法之K-means
- Gradle构建多模块项目(整合Java SE 和 Springboot)
- 两个机器配置免密码访问
- JFrame如何处理组件上发生的事件
- 新人产品分析——第三步(1)
- QML之MouseArea事件
- 用代码聊算法之k-means算法
- 新人产品分析——第三步(2)
- Problem H: 稀疏矩阵的表示和运算
- /bin/bash^M: 坏的解释器: 没有那个文件或目录
- C语言的存储类别
- 一个SQL语句
- HDU Ant Trip
- 24. OP-TEE驱动篇----驱动编译,加载和初始化(一)
- 再谈 CSS 预处理器