跟着Leo机器学习实战:Kmeans聚类 Kmeans聚类 优点:容易实现 缺点:容易陷入局部最小值,在大规模数据收敛很慢。 适用数据类型:数值型数据 伪代码 加载数据 from numpy import * def loadDataSet(fileName): #加载数据 dataMat = [] #assume last column is target value fr = open(fileName) for line in fr.readlines(): curLine = line.strip().s KMeans聚类是一种广泛应用的无监督机器学习算法,主要用于数据的分类和聚类。它的主要目的是将相似的数据点归入同一个类别(簇),通过寻找数据点间的最优分组来简化复杂的数据结构。KMeans算法的核心思想是迭代地更新簇中心(centroid)和重新分配数据点,直到满足某种停止条件,比如簇中心不再显著移动或达到预设的迭代次数。 KMeans的优点在于其简单易实现,对于数值型数据有很好的处理效果。然而,它也存在一些明显的缺点。KMeans算法可能会陷入局部最优,因为初始化的簇中心选择会影响最终的聚类结果。对于大规模数据集,KMeans的收敛速度较慢,需要大量的计算资源。此外,KMeans假设数据分布是球形的,如果数据分布不规则,可能无法得到理想的结果。 以下是一段基于Python的KMeans聚类的伪代码: ```python import numpy as np # 加载数据 def loadDataSet(fileName): dataMat = [] with open(fileName) as fr: for line in fr.readlines(): curLine = line.strip().split('\t') fltLine = list(map(float, curLine)) dataMat.append(fltLine) return np.array(dataMat) # 计算两个向量的欧氏距离 def distEclud(vecA, vecB): return np.sqrt(np.sum(np.power(vecA - vecB, 2))) # 随机产生k个在数据范围内的中心点 def randCent(dataSet, k): n = dataSet.shape[1] centroids = np.zeros((k, n)) for j in range(n): minJ = np.min(dataSet[:, j]) rangeJ = (np.max(dataSet[:, j]) - minJ) centroids[:, j] = minJ + rangeJ * np.random.rand(k, 1) return centroids # KMeans训练函数 def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent): m = dataSet.shape[0] clusterAssment = np.zeros((m, 2)) centroids = createCent(dataSet, k) while True: clusterChanged = False for i in range(m): minDist = np.inf; minIndex = -1 for j in range(k): distJI = distMeas(centroids[j], dataSet[i]) if distJI < minDist: minDist = distJI; minIndex = j if clusterAssment[i, 0] != minIndex: clusterChanged = True clusterAssment[i, :] = minIndex, minDist**2 if not clusterChanged: break centroids = [np.mean(dataSet[clusterAssment[:, 0] == c], axis=0) for c in range(k)] return centroids, clusterAssment ``` 上述代码中,`loadDataSet`函数用于从文件加载数据,`distEclud`计算两个向量之间的欧氏距离。`randCent`函数随机初始化k个中心点,`kMeans`函数是KMeans的主要实现,包括了数据点的分配和簇中心的更新。 此外,还有一种优化版的KMeans算法叫做二分KMeans(Bi-KMeans)。它的基本思想是在每次迭代中,将当前的簇一分为二,以减少簇内的数据点差异。这种方法可以改善聚类效果,尤其是在簇大小差异较大的情况下。但是,二分KMeans的实现较为复杂,需要额外考虑如何选择最佳的分割点。 KMeans聚类算法在数据挖掘和机器学习中有着广泛的应用,但需要根据具体问题和数据特性进行适当的调整和优化。理解其优缺点以及不同实现方式可以帮助我们更好地应用和改进这一经典算法。
- 粉丝: 6
- 资源: 878
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助