程序示例–二分 K-Means

仍然是在 kmeans.py 中,我们又添加了二分 K-Means 算法:

# coding: utf-8
# kmeans/kmeans.py# ...
def biKmeans(dataSet, k):"""Args:def biKmeans(dataSet, k):"""二分kmeans算法Args:dataSet: 数据集k: 聚类数Returns:centroids: 聚类中心clusterAssment: 点分配结果"""m, n = np.shape(dataSet)# 起始时,只有一个簇,该簇的聚类中心为所有样本的平均位置centroid0 = np.mean(dataSet, axis=0).tolist()[0]# 设置一个列表保存当前的聚类中心currentCentroids = [centroid0]# 点分配结果: 第一列指明样本所在的簇,第二列指明该样本到聚类中心的距离clusterAssment = np.mat(np.zeros((m, 2)))# 初始化点分配结果,默认将所有样本先分配到初始簇for j in range(m):clusterAssment[j, 1] = distEclud(dataSet[j, :], np.mat(centroid0))**2# 直到簇的数目达标while len(currentCentroids) < k:# 当前最小的代价lowestError = np.inf# 对于每一个簇for j in range(len(currentCentroids)):# 获得该簇的样本ptsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == j)[0], :]# 在该簇上进行2-means聚类# 注意,得到的centroids,其聚类编号含0,1centroids, clusterAss = kMeans(ptsInCluster, 2)# 获得划分后的误差之和splitedError = np.sum(clusterAss[:, 1])# 获得其他簇的样本ptsNoInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A != j)[0]]# 获得剩余数据集的误差nonSplitedError = np.sum(ptsNoInCluster[:, 1])# 比较,判断此次划分是否划算if (splitedError + nonSplitedError) < lowestError:# 如果划算,刷新总误差lowestError = splitedError + nonSplitedError# 记录当前的应当划分的簇needToSplit = j# 新获得的簇以及点分配结果newCentroids = centroids.AnewClusterAss = clusterAss.copy()# 更新簇的分配结果# 第0簇应当修正为被划分的簇newClusterAss[np.nonzero(newClusterAss[:, 0].A == 0)[0], 0] = needToSplit# 第1簇应当修正为最新一簇newClusterAss[np.nonzero(newClusterAss[:, 0].A == 1)[0], 0] = len(currentCentroids)# 被划分的簇需要更新currentCentroids[needToSplit] = newCentroids[0, :]# 加入新的划分后的簇currentCentroids.append(newCentroids[1, :])# 刷新点分配结果clusterAssment[np.nonzero(clusterAssment[:, 0].A == needToSplit)[0], :] = newClusterAssreturn np.mat(currentCentroids), clusterAssmentdataSet: 数据集k: 聚类数Returns:centroids: 聚类中心clusterAssment: 点分配结果"""# 随机初始化聚类中心centroids = randCent(dataSet, k)m, n = np.shape(dataSet)# 点分配结果: 第一列指明样本所在的簇,第二列指明该样本到聚类中心的距离clusterAssment = np.mat(np.zeros((m, 2)))# 标识聚类中心是否仍在改变clusterChanged = True# 直至聚类中心不再变化while clusterChanged:clusterChanged = False# 分配样本到簇for i in range(m):# 计算第i个样本到各个聚类中心的距离minIndex = 0minDist = np.inffor j in range(k):dist = distEclud(dataSet[i, :],  centroids[j, :])if(dist < minDist):minIndex = jminDist = dist# 判断cluster是否改变if(clusterAssment[i, 0] != minIndex):clusterChanged = TrueclusterAssment[i, :] = minIndex, minDist**2# 刷新聚类中心: 移动聚类中心到所在簇的均值位置for cent in range(k):# 通过数组过滤获得簇中的点ptsInCluster = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]]# 计算均值并移动centroids[cent, :] = np.mean(ptsInCluster, axis=0)return centroids, clusterAssment
# ...

测试

# coding: utf-8
# kmeans/test_bi_kmeans.pyimport kmeans
import numpy as np
import matplotlib.pyplot as pltif __name__ == "__main__":dataMat = np.mat(kmeans.loadDataSet('data/testSet2.txt'))centroids, clusterAssment = kmeans.biKmeans(dataMat, 3)clusterCount = centroids.shape[0]m = dataMat.shape[0]# 绘制散点图patterns = ['o', 'D', '^']colors = ['b', 'g', 'y']fig = plt.figure()title = 'bi-kmeans with k=3'ax = fig.add_subplot(111, title=title)for k in range(clusterCount):# 绘制聚类中心ax.scatter(centroids[k,0], centroids[k,1], color='r', marker='+', linewidth=20)for i in range(m):# 绘制属于该聚类中心的样本ptsInCluster = dataMat[np.nonzero(clusterAssment[:, 0].A==k)[0]]ax.scatter(ptsInCluster[:, 0].flatten().A[0], ptsInCluster[:, 1].flatten().A[0], marker=patterns[k], color=colors[k])plt.show()

运行结果如下:

6.8 程序示例--二分 K-Means-机器学习笔记-斯坦福吴恩达教授相关推荐

  1. 5.11 程序示例--垃圾邮件检测-机器学习笔记-斯坦福吴恩达教授

    程序示例–垃圾邮件检测 邮件内容的预处理 下面展示了一封常见的 email,邮件内容包含了一个 URL (http://www.rackspace.com/),一个邮箱地址(groupname-uns ...

  2. 2.7 程序示例--多分类问题-机器学习笔记-斯坦福吴恩达教授

    程序示例–多分类问题 我们采用 One-vs-All 方法来进行多分类,在原有的逻辑回归模块中添加 One-vs-All 的训练以及预测方法: # coding: utf-8 # logical_re ...

  3. 2.5 程序示例--非线性决策边界-机器学习笔记-斯坦福吴恩达教授

    程序示例–非线性决策边界 我们首先对数据进行了多项式拟合,再分别使用 λ=0,λ=1,λ=100λ=0,λ=1,λ=100λ=0,λ=1,λ=100 的批量梯度下降法(sgd)完成了训练,获得了非线性 ...

  4. 2.4 程序示例--线性决策边界-机器学习笔记-斯坦福吴恩达教授

    程序示例–线性决策边界 回归模块 在逻辑回归模块 logical_regression.py 中,实现了批量梯度下降法(bgd)以及随机梯度下降法(sgd),同时,支持正规化方程 # coding: ...

  5. 1.9 程序示例--局部加权线性回归-机器学习笔记-斯坦福吴恩达教授

    程序示例–局部加权线性回归 现在,我们在回归中又添加了 JLwr() 方法用于计算预测代价,以及 lwr() 方法用于完成局部加权线性回归: # coding: utf-8 # linear_regr ...

  6. 3.12 程序示例--多分类问题-机器学习笔记-斯坦福吴恩达教授

    多分类问题 我们手上包含有手写字符的数据集,该数据集来自斯坦福机器学习的课后作业,每个字符图片大小为 20×20 ,总的样本规模为 5000×400 , 我们的神经网络设计如下,包含 1 个隐含层,隐 ...

  7. 6.6 二分 K-Means 算法-机器学习笔记-斯坦福吴恩达教授

    二分 K-Means 算法 该算法补充自 <机器学习实战> 一书 常规的 K-Means 算法的误差通常只能收敛到局部最小,在此,引入一种称为二分 K-Means(bisecting km ...

  8. 4.4 机器学习系统设计--垃圾邮件分类-机器学习笔记-斯坦福吴恩达教授

    机器学习系统设计–垃圾邮件分类 假定我们现有一封邮件,其内容如下: From: cheapsales@buystufffromme.com To: ang@cs.stanford.edu Subjec ...

  9. 5.7 程序示例--基于 SMO 的 SVM 模型-机器学习笔记-斯坦福吴恩达教授

    程序示例–基于 SMO 的 SVM 模型 在这里,我们会实现一个基于 SMO 的 SVM 模型,在其中,提供了简化版 SMO 和 完整版 SMO 的实现. 简化版 SMO:不使用启发式方法选择 (α( ...

最新文章

  1. 网站的加载速度该如何进行优化提升?
  2. c语言字符串操作面试题,C语言常见字符串面试题.pdf
  3. 【OpenYurt 深度解析】边缘网关缓存能力的优雅实现
  4. 如何在Kali Linux中安装Google Chrome浏览器
  5. maven中properties标签定义变量
  6. HDU 1010 Tempter of the Bone DFS(奇偶剪枝优化)
  7. POJ2182-Lost Cows【树状数组,二分】
  8. 分布式版本控制系统入门
  9. 2019年9月全国程序员工资统计
  10. python正则表达式【标准库—re】
  11. python3网络爬虫(2.1):爬取堆糖美女
  12. 魔百盒CM201-2-YS代工-刷机固件及教程
  13. html5调用腾讯视频,小程序h5获取腾讯视频的真实mp4地址video!【前端+后端方法】...
  14. RuntimeTransformGizmo:位移、旋转、缩放插件
  15. Web前端面试指导(四十):CSS3有哪些新特性?
  16. mmsegmentation安装过程报错记录
  17. android延迟刷新adapter,Android关于Adapter更新数据问题案例
  18. python 处理xml中的注释_python 处理xml 笔记
  19. SwinUnet官方代码训练自己数据集(单通道灰度图像的分割)
  20. 初学者如何查阅自然语言处理(NLP)领域学术资料

热门文章

  1. 在Linux系统安装Nodejs 最简单步骤
  2. angular 与 highcharts 结合使用
  3. SecutrCRTt 连接VirtualBox 中的Ubuntu -端口转发
  4. BootStrap2学习日记8---表单
  5. Font Rending 的 Hint 机制对排版的影响
  6. SqlAlchemy个人学习笔记完整汇总
  7. vsftp 在pasv下的防火墙配置
  8. 数据库抽象层 PDO
  9. ASP.NET中级学习2
  10. opencv视频处理和检测学习总结