华盛顿大学 machine learning 笔记。

K-means algorithm

算法步骤:

 0. 初始化几个聚类中心 (cluster centers)μ1,μ2, … , μk

      

 1. 将所有数据点分配给最近的聚类中心;

    

   

 2. 将每个聚类中心的值改成分配到该点所有数据点的均值;

    

 3. 重复1-2步骤,直到收敛到局部最优(local optimium).

   

#输入:
#数据集 data
#集群数 k
#初始集群中心组 initial_centroids
#最多循环次数 maxiter
#输出:
#集群中心组 centroids
#数据点分配情况 cluster_assignment
def kmeans(data, k, initial_centroids, maxiter):
centroids = initial_centroids[:]
prev_cluster_assignment = None for itr in xrange(maxiter): # 计算各数据点到各个centroid的距离
distances_from_centroids = pairwise_distances(data, centroids, metric='euclidean')
# 将数据点分配到各个centroid
cluster_assignment = np.argmin(distances_from_centroids, axis = 1) # 将每个centroid的值改成分配到该点的所有数据点的均值
new_centroids = []
for i in xrange(k):
member_data_points = data[cluster_assignment == i]
centroid = member_data_points.mean(axis = 0)
# 格式转换
centroid = centroid.A1
new_centroids.append(centroid)
new_centroids = np.array(new_centroids)
centroids = new_centroids # 判断是否收敛到局部最优
if prev_cluster_assignment is not None and \
(prev_cluster_assignment==cluster_assignment).all():
break prev_cluster_assignment = cluster_assignment[:] return centroids, cluster_assignment

问题1: 算法结果为局部最优,受初始化选择的聚类中心影响很大,如何初始化?

k-means ++:

  1.第一个聚类中心从随机点中随机选择。

  2.对于每个数据点,计算到最近集群中心的距离。

  3.从数据点中选择新的集群中心,数据点选择概率与它离最近的集群中心的距离成比例(使centroids之间离得越远越好)。

  4.重复步骤2和3,直到k个中心全被选中。

特点:

  随机初始化计算成本相对较高,但随后通常会更迅速地收敛,局部最优质量更高,运行时间短。

def smart_initialize(data, k):
# k-means++ 方法 得到初始的centroids组
centroids = np.zeros((k, data.shape[1])) # 随机选择第一个centroid
idx = np.random.randint(data.shape[0])
centroids[0] = data[idx,:].toarray() # 计算其他数据点到第一个centroid的距离
squared_distances = pairwise_distances(data, centroids[0:1], metric='euclidean').flatten()**2 # 选择接下来的 k-1 个centroids
# 每个数据点被选中的概率与它离最近的centroid的距离成比例(即使得centroids之间离得越远越好)
for i in xrange(1, k):
idx = np.random.choice(data.shape[0], 1, p=squared_distances/sum(squared_distances))
centroids[i] = data[idx,:].toarray()
# 更新每个数据点离已选择的centroids的距离
squared_distances = np.min(pairwise_distances(data, centroids[0:i+1], metric='euclidean')**2,axis=1) return centroids

 

问题2:如何评价聚类算法结果的质量?

  两种聚类方法,第二种更符合我们对聚类算法的预期,如何评估聚类的结果?

    

  最小化距离的平方和:

        

问题3: 如何选择合适的k?

随着k的增加,聚类算法的异质性(heterogeneity)会降低。

  heterogeneity 表达式:

  

方法一:拐点法

  

  选取拐点处的k值。

  

  方法二:均方根:   (n个数据点)

retrival and clustering : week 3 k-means 笔记的更多相关文章

  1. retrival and clustering : week 4 GMM & EM 笔记

    华盛顿大学 机器学习 笔记. k-means的局限性 k-means 是一种硬分类(hard assignment)方法,例如对于文档分类问题,k-means会精确地指定某一文档归类到某一个主题,但很 ...

  2. retrival and clustering: week 2 knn & LSH 笔记

    华盛顿大学 <机器学习> 笔记. knn k-nearest-neighbors : k近邻法 给定一个 数据集,对于查询的实例,在数据集中找到与这个实例最邻近的k个实例,然后再根据k个最 ...

  3. KNN 与 K - Means 算法比较

    KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...

  4. C程序设计语言(K&R)笔记

    1.表达式中float类型的操作数不会自动转换为double类型.一般来说,数学函数(如math.h)使用双精度类型的变量.使用float类型主要是为了在使用较大数组时节省存储空间,有时也为了节省机器 ...

  5. 软件——机器学习与Python,聚类,K——means

    K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...

  6. [DL学习笔记]从人工神经网络到卷积神经网络_1_神经网络和BP算法

    前言:这只是我的一个学习笔记,里边肯定有不少错误,还希望有大神能帮帮找找,由于是从小白的视角来看问题的,所以对于初学者或多或少会有点帮助吧. 1:人工全连接神经网络和BP算法 <1>:人工 ...

  7. 【机器学习笔记之一】深入浅出学习K-Means算法

    摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 在数据挖掘中,K-Means算法是一种c ...

  8. kmeans笔记

    1.算法过程 a.随机选取k个初始点作为中心点 b.依次计算剩余所有点分别与哪个初始点距离较近,则该点属于哪个簇 c.移动中心点到现在的簇的中心 d.重复b,c两步,直到中心点不再变化算法结束 2.优 ...

  9. 机器学习10—K-均值聚类学习笔记

    机器学习实战之K-Means算法 test10.py #-*- coding:utf-8 import sys sys.path.append("kMeans.py") impor ...

随机推荐

  1. 【转】maven常见问题问答

    转自:http://www.iteye.com/topic/973166 前言 Maven,发音是[`meivin],"专家"的意思.它是一个很好的项目管理工具,很早就进入了我的必 ...

  2. Odoo/OpenERP 日志配置、使用及实现

    当应用处于生产环境时,日志提供了有价值的运行时调试及监控信息,并且,也是一个有用的调试工具对于处于开发阶段的应用来说.此文描述在Odoo8.0中日志的配置.使用及实现 日志配置        Odoo ...

  3. C++14系列(1):Linux下C++14开发环境配置

    g++安装 參考地址: http://sysads.co.uk/2014/07/install-gcc-gnu-4-9-1-on-ubuntu-14-04/ 当前Ubuntu的LTS版本号为14.04 ...

  4. bootstrap学习笔记 多媒体对象

    本文将介绍Bootstrap中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用 ...

  5. Mac /Ubuntu/Windows 下安装nodejs

    Mac If you're using the excellent homebrew package manager, you can install node with one command: b ...

  6. python selenium--常用函数1

    新建实例driver = webdriver.Chrome() 1.通过标签属性Id查找元素 方法:find_element_by_id(element_id) 实例:driver.find_elem ...

  7. Josephus排列

    思考与分析: 对于m为常数,能够用循环链表,用head,tail标志头尾指针使其易于表示循环结构.循环输出后删除结点n次,每次外层循环时.内层都固定循环m次.所以执行时间为O(mn)=O(n). 对于 ...

  8. Atitit.jpg png格式差别以及解决jpg图片不显示的问题

    Atitit.模板引擎原理以及常见模板技术 1. Asp Php jsp smarty模板1 1.1. 模板引擎基本原理1 1.2. 调试模式原理2 2. Attilax总结的模板引擎原理2 3. 支 ...

  9. Atitit.分区对索引的影响 分区索引和全局索引 attilax总结

    Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, ...

  10. IOS使用Charts

    近期项目中要做图表功能,为了降低开发量採用的是H5+ECharts来做.这里说一下IOS中怎样使用ECharts以及遇到的问题. 网络模块化单文件引入 <!DOCTYPE html> &l ...