目录

介绍

KMeans模型

KMEANS

平分KMeans

KMEANS ++

结论与分析


可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表。

介绍

KMeans是一种简单的聚类算法,它计算样本和质心之间的距离以生成聚类。K是用户给出的簇数。在初始时,随机选择K个簇,在每次迭代时调整它们以获得最佳结果。质心是其相应聚类中样本的平均值,因此,该算法称为K“均值”。

KMeans模型

KMEANS

普通的KMeans算法非常简单。将K簇表示为,并将每个簇中的样本数表示为  。KMeans的损失函数是:

计算损失函数的导数:

然后,使导数等于0,我们可以得到:

即,质心是其相应聚类中的样本的手段。KMeans的代码如下所示:

def kmeans(self, train_data, k):sample_num = len(train_data)distances = np.zeros([sample_num, 2])                      # (index, distance)centers = self.createCenter(train_data)centers, distances = self.adjustCluster(centers, distances, train_data, self.k)return centers, distances

在adjustCluster()确定初始质心后调整质心的位置,旨在最小化损失函数。adjustCluster的代码是:

def adjustCluster(self, centers, distances, train_data, k):sample_num = len(train_data)flag = True  # If True, update cluster_centerwhile flag:flag = Falsed = np.zeros([sample_num, len(centers)])for i in range(len(centers)):# calculate the distance between each sample and each cluster centerd[:, i] = self.calculateDistance(train_data, centers[i])# find the minimum distance between each sample and each cluster centerold_label = distances[:, 0].copy()distances[:, 0] = np.argmin(d, axis=1)distances[:, 1] = np.min(d, axis=1)if np.sum(old_label - distances[:, 0]) != 0:flag = True# update cluster_center by calculating the mean of each clusterfor j in range(k):current_cluster =train_data[distances[:, 0] == j]  # find the samples belong# to the j-th cluster centerif len(current_cluster) != 0:centers[j, :] = np.mean(current_cluster, axis=0)return centers, distances

平分KMeans

因为KMeans可能得到局部优化结果,为了解决这个问题,我们引入了另一种称为平分KMeans的KMeans算法。在平分KMeans时,所有样本在初始时被视为一个簇,并且簇被分成两部分。然后,选择分割簇的一部分一次又一次地平分,直到簇的数量为K。我们根据最小平方误差和(SSE)对簇进行平分。将当前n群集表示为:

我们选择一个集群中的,并平分它分成两个部分使用正常的K均值。SSE是:

我们选择,其可以获得最小的SSE作为要被平分的集群,即:

重复上述过程,直到簇的数量为K。

def biKmeans(self, train_data):sample_num = len(train_data)distances = np.zeros([sample_num, 2])         # (index, distance)initial_center = np.mean(train_data, axis=0)  # initial cluster #shape (1, feature_dim)centers = [initial_center]                    # cluster list# clustering with the initial cluster centerdistances[:, 1] = np.power(self.calculateDistance(train_data, initial_center), 2)# generate cluster centerswhile len(centers) < self.k:# print(len(centers))min_SSE  = np.infbest_index = Nonebest_centers = Nonebest_distances = None# find the best splitfor j in range(len(centers)):centerj_data = train_data[distances[:, 0] == j]   # find the samples belonging# to the j-th centersplit_centers, split_distances = self.kmeans(centerj_data, 2)split_SSE = np.sum(split_distances[:, 1]) ** 2    # calculate the distance# for after clusteringother_distances = distances[distances[:, 0] != j] # the samples don't belong# to j-th centerother_SSE = np.sum(other_distances[:, 1]) ** 2    # calculate the distance# don't belong to j-th center# save the best split resultif (split_SSE + other_SSE) < min_SSE:best_index = jbest_centers = split_centersbest_distances = split_distancesmin_SSE = split_SSE + other_SSE# save the spilt databest_distances[best_distances[:, 0] == 1, 0] = len(centers)best_distances[best_distances[:, 0] == 0, 0] = best_indexcenters[best_index] = best_centers[0, :]centers.append(best_centers[1, :])distances[distances[:, 0] == best_index, :] = best_distancescenters = np.array(centers)   # transform form list to arrayreturn centers, distances

KMEANS ++

因为初始质心对KMeans的性能有很大影响,为了解决这个问题,我们引入了另一种名为KMeans ++的KMeans算法。将当前n群集表示为:

当我们选择第(n + 1)个质心时,样本离现有质心越远,它就越有可能被选为新的质心。首先,我们计算每个样本与现有质心之间的最小距离:

然后,计算每个样本被选为下一个质心的概率:

然后,我们使用轮盘选择来获得下一个质心。确定K群集后,运行adjustCluster()以调整结果。

def kmeansplusplus(self,train_data):sample_num = len(train_data)distances = np.zeros([sample_num, 2])       # (index, distance)# randomly select a sample as the initial clusterinitial_center = train_data[np.random.randint(0, sample_num-1)]centers = [initial_center]while len(centers) < self.k:d = np.zeros([sample_num, len(centers)])for i in range(len(centers)):# calculate the distance between each sample and each cluster centerd[:, i] = self.calculateDistance(train_data, centers[i])# find the minimum distance between each sample and each cluster centerdistances[:, 0] = np.argmin(d, axis=1)distances[:, 1] = np.min(d, axis=1)# Roulette Wheel Selectionprob = np.power(distances[:, 1], 2)/np.sum(np.power(distances[:, 1], 2))index = self.rouletteWheelSelection(prob, sample_num)new_center = train_data[index, :]centers.append(new_center)# adjust clustercenters = np.array(centers)   # transform form list to arraycenters, distances = self.adjustCluster(centers, distances, train_data, self.k)return centers, distances

结论与分析

实际上,在确定如何选择参数'K'之后有必要调整簇,存在一些算法。最后,让我们比较三种聚类算法的性能。

可以发现KMeans ++具有最佳性能。

可以在MachineLearning中找到本文中的相关代码和数据集。

有兴趣的小伙伴可以查看上一篇和下一篇。

原文地址:https://www.codeproject.com/Articles/5061517/Step-by-Step-Guide-to-Implement-Machine-Learning-X

实现机器学习的循序渐进指南X——KMeans相关推荐

  1. 实现机器学习的循序渐进指南系列汇总

    之前曾尝试翻译了机器学习中的KNN和决策树,最近这段时间陆续看到这个系列的相关文章,并尝试翻译分析.由于此系列文章直接相对零散,所以有了这篇简单的汇总文章,以帮助有兴趣的小伙伴迅速找到想看的文章. 具 ...

  2. 实现机器学习的循序渐进指南XI——DBSCAN

    目录 介绍 DBSCAN模型 开始 聚类算法 参数估计 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 基于密度的噪声应用空间聚类(DBSCAN)是一种基于密度 ...

  3. 实现机器学习的循序渐进指南XII——Apriori

    目录 介绍 Apriori模型 频繁项集 关联规则 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 Apriori是一种学习频繁项集和关联规则的算法.Aprio ...

  4. 实现机器学习的循序渐进指南VIII——线性回归

    目录 介绍 回归模型 线性回归 局部加权线性回归 岭回归 套索(Lasso)回归 逐步线性回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 通常存在变量之间 ...

  5. 实现机器学习的循序渐进指南IX ——树回归

    目录 介绍 回归模型 特征选择 回归树的生成 回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 在现实世界中,一些关系不是线性的.因此,应用线性回归分析这些 ...

  6. 实现机器学习的循序渐进指南VII——Blending Stacking

    目录 介绍 混合(Blending)模型 混合(Blending)架构 混合(Blending)实现 混合(Blending)分类 堆叠(Stacking)模型 堆叠(Stacking)架构 堆叠(S ...

  7. 实现机器学习的循序渐进指南VI——AdaBoost

    目录 介绍 AdaBoost模型 弱分类器 权重更新 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 AdaBoost是Boosting的一种方法,它基于 ...

  8. 实现机器学习的循序渐进指南V——支持向量机

    目录 介绍 SVM模型 优化问题 优化算法 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 支持向量机(SVM)是一种基于特征空间最大边距的分类器.SVM ...

  9. 实现机器学习的循序渐进指南IV——逻辑回归

    目录 介绍 逻辑回归模型 参数估计 优化算法 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 逻辑回归是统计学习中的经典方法,它计算条件概率P(Y|X)并 ...

最新文章

  1. SCCM2012系列之三,SCCM2012部署前的IIS准备
  2. linux目录名含义
  3. CentOS 6.6编译安装Squid 配置反向代理服务器
  4. Request —— 获取请求行数据 获取请求头数据 获取请求体数据
  5. 小程序上让随机的两个点都显示在地图可视区域
  6. Java中的面向接口编程
  7. linux 搜索 文件 内容,Linux 文件查找及文件内容查找
  8. Android笔记 codeUI与html UI
  9. 解码(五):sws_getContext和sws_scale像素格式和尺寸转换函数详解
  10. Eclipse用法和技巧十二:快速复制一行
  11. TypeError: ‘RClass‘ object is not callable, TypeError: ‘CClass‘ object is not callable
  12. 解决ColorPix拾色器提取颜色错误
  13. java运行环境搭建_java的运行环境
  14. Unity实现音乐播放器
  15. 面向自动驾驶车辆验证的抽象仿真场景生成
  16. Linux nm命令详解
  17. tring_vector容器test
  18. arthas离线包使用说明
  19. Redis 集群搭建及集群管理工具
  20. 【架构师-系统设计】理解分布式系统的CAP和BASE理论

热门文章

  1. python分布式框架celery项目开发_本项目在 Celery 分布式爬虫的基础上构建监控方案 Demo...
  2. html5+中奖结果页面,html5+css3实现抽奖活动的效果
  3. spark的python开发安装方式_windows下安装spark-python
  4. 平面设计师进步素材模板,设计基础!
  5. android导入项目j,如何使用AndroidStudio将开源项目library发布到jcenter
  6. java 并发_Java并发编程中断机制 so easy
  7. IQ数据简介:I/Q Data
  8. Linux设备驱动与整个软硬件系统的关系
  9. flask mysql 配置文件_flask配置文件的几种方法
  10. 改变人类社会的五位数学大家