实现机器学习的循序渐进指南X——KMeans
目录
介绍
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相关推荐
- 实现机器学习的循序渐进指南系列汇总
之前曾尝试翻译了机器学习中的KNN和决策树,最近这段时间陆续看到这个系列的相关文章,并尝试翻译分析.由于此系列文章直接相对零散,所以有了这篇简单的汇总文章,以帮助有兴趣的小伙伴迅速找到想看的文章. 具 ...
- 实现机器学习的循序渐进指南XI——DBSCAN
目录 介绍 DBSCAN模型 开始 聚类算法 参数估计 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 基于密度的噪声应用空间聚类(DBSCAN)是一种基于密度 ...
- 实现机器学习的循序渐进指南XII——Apriori
目录 介绍 Apriori模型 频繁项集 关联规则 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 Apriori是一种学习频繁项集和关联规则的算法.Aprio ...
- 实现机器学习的循序渐进指南VIII——线性回归
目录 介绍 回归模型 线性回归 局部加权线性回归 岭回归 套索(Lasso)回归 逐步线性回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 通常存在变量之间 ...
- 实现机器学习的循序渐进指南IX ——树回归
目录 介绍 回归模型 特征选择 回归树的生成 回归 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 在现实世界中,一些关系不是线性的.因此,应用线性回归分析这些 ...
- 实现机器学习的循序渐进指南VII——Blending Stacking
目录 介绍 混合(Blending)模型 混合(Blending)架构 混合(Blending)实现 混合(Blending)分类 堆叠(Stacking)模型 堆叠(Stacking)架构 堆叠(S ...
- 实现机器学习的循序渐进指南VI——AdaBoost
目录 介绍 AdaBoost模型 弱分类器 权重更新 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 AdaBoost是Boosting的一种方法,它基于 ...
- 实现机器学习的循序渐进指南V——支持向量机
目录 介绍 SVM模型 优化问题 优化算法 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 支持向量机(SVM)是一种基于特征空间最大边距的分类器.SVM ...
- 实现机器学习的循序渐进指南IV——逻辑回归
目录 介绍 逻辑回归模型 参数估计 优化算法 分类 结论与分析 可访问 实现机器学习的循序渐进指南系列汇总,获取本系列完成文章列表. 介绍 逻辑回归是统计学习中的经典方法,它计算条件概率P(Y|X)并 ...
最新文章
- SCCM2012系列之三,SCCM2012部署前的IIS准备
- linux目录名含义
- CentOS 6.6编译安装Squid 配置反向代理服务器
- Request —— 获取请求行数据 获取请求头数据 获取请求体数据
- 小程序上让随机的两个点都显示在地图可视区域
- Java中的面向接口编程
- linux 搜索 文件 内容,Linux 文件查找及文件内容查找
- Android笔记 codeUI与html UI
- 解码(五):sws_getContext和sws_scale像素格式和尺寸转换函数详解
- Eclipse用法和技巧十二:快速复制一行
- TypeError: ‘RClass‘ object is not callable, TypeError: ‘CClass‘ object is not callable
- 解决ColorPix拾色器提取颜色错误
- java运行环境搭建_java的运行环境
- Unity实现音乐播放器
- 面向自动驾驶车辆验证的抽象仿真场景生成
- Linux nm命令详解
- tring_vector容器test
- arthas离线包使用说明
- Redis 集群搭建及集群管理工具
- 【架构师-系统设计】理解分布式系统的CAP和BASE理论
热门文章
- python分布式框架celery项目开发_本项目在 Celery 分布式爬虫的基础上构建监控方案 Demo...
- html5+中奖结果页面,html5+css3实现抽奖活动的效果
- spark的python开发安装方式_windows下安装spark-python
- 平面设计师进步素材模板,设计基础!
- android导入项目j,如何使用AndroidStudio将开源项目library发布到jcenter
- java 并发_Java并发编程中断机制 so easy
- IQ数据简介:I/Q Data
- Linux设备驱动与整个软硬件系统的关系
- flask mysql 配置文件_flask配置文件的几种方法
- 改变人类社会的五位数学大家