Python数据分析笔记:聚类算法之K均值

我们之前接触的所有机器学习算法都有一个共同特点,那就是分类器会接受2个向量:一个是训练样本的特征向量X,一个是样本实际所属的类型向量Y。由于训练数据必须指定其真实分类结果,因此这种机器学习统称为有监督学习

然而有时候,我们只有训练样本的特征,而对其类型一无所知。这种情况,我们只能让算法尝试在训练数据中寻找其内部的结构,试图将其类别挖掘出来。这种方式叫做无监督学习。由于这种方式通常是将样本中相似的样本聚集在一起,所以又叫聚类算法

下面我们介绍一个最常用的聚类算法:K均值聚类算法(K-Means)。

1、K均值聚类

K-Means算法思想简单,效果却很好,是最有名的聚类算法。聚类算法的步骤如下:

1:初始化K个样本作为初始聚类中心;

2:计算每个样本点到K个中心的距离,选择最近的中心作为其分类,直到所有样本点分类完毕;

3:分别计算K个类中所有样本的质心,作为新的中心点,完成一轮迭代。

通常的迭代结束条件为新的质心与之前的质心偏移值小于一个给定阈值。

下面给一个简单的例子来加深理解。如下图有4个样本点,坐标分别为A(-1,-1),B(1,-1),C(-1,1),D(1,1)。现在要将他们聚成2类,指定A、B作为初始聚类中心(聚类中心A0, B0),指定阈值0.1。K-Means迭代过程如下:

step 1.1:计算各样本距离聚类中心的距离:

样本A:d(A,A0) = 0; d(A,B0) = 2;因此样本A属于A0所在类;

样本B:d(B,A0) = 2; d(B,B0) = 0;因此样本B属于B0所在类;

样本C:d(C,A0) = 2; d(C,B0) = 2.8;;因此样本C属于A0所在类;

样本C:d(D,A0) = 2.8; d(D,B0) = 2;;因此样本C属于B0所在类;

step 1.2:全部样本分类完毕,现在计算A0类(包含样本AC)和B0类(包含样本BD)的新的聚类中心:

A1 = (-1, 0); B1 = (1,0);

step 1.3:计算聚类中心的偏移值是否满足终止条件:

|A1-A0| = |(-1,0)-(-1,-1) | = |(0,1)| = 1 >0.1,因此继续迭代。

此时的状态如下图所示:

step 2.1:计算各样本距离聚类中心的距离:

样本A:d(A,A1) = 1; d(A,B1) = 2.2;因此样本A属于A1所在类;

样本B:d(B,A1) = 2.2; d(B,B1) = 1;因此样本B属于B1所在类;

样本C:d(C,A1) = 1; d(C,B1) = 2.2;;因此样本C属于A1所在类;

样本D:d(D,A1) = 2.2; d(D,B1) = 1;;因此样本C属于B1所在类;

step 2.2:全部样本分类完毕,现在计算A1类(包含样本AC)和B1类(包含样本BD)的新的聚类中心:

A2 = (-1, 0); B2 = (1,0);

step 2.3:计算聚类中心的偏移值是否满足终止条件:

|A2-A1| = |B2-B1| = 0 <0.1,因此迭代终止。

2、测试数据

下面这个测试数据有点类似SNS中的好友关系,假设是10个来自2个不同的圈子的同学的SNS聊天记录。显然,同一个圈子内的同学会有更密切的关系和互动。

数据如下所示,每一行代表一个好友关系。如第一行表示同学0与同学1的亲密程度为9(越高表示联系越密切)。

显然,这个数据中并没有告知我们这10个同学分别属于哪个圈子。因此我们的目标是使用K-Means聚类算法,将他们聚成2类。

[plain] view plaincopy

  1. 0 1 9
  2. 0 2 5
  3. 0 3 6
  4. 0 4 3
  5. 1 2 8
  6. ......

这个例子设计的很简单。我们使用上一篇文章中提到的关系矩阵,将其可视化出来,会看到如下结果:

这是个上三角矩阵,因为这个数据中认为好友关系是对称的。上图其实很快能发现,0,1,2,3,4用户紧密联系在一起,而5,6,7,8,9组成了另外一个圈子。

下面我们看看K-Means算法能否找出这个答案。

3、代码与分析

K-Means算法的Python代码如下:

[python] view plaincopy

  1. # -*- coding: utf-8 -*-
  2. from matplotlib import pyplot
  3. import scipy as sp
  4. import numpy as np
  5. from sklearn import svm
  6. import matplotlib.pyplot as plt
  7. from sklearn.cluster import KMeans
  8. from scipy import sparse
  9. #数据读入
  10. data = np.loadtxt('2.txt')
  11. x_p = data[:, :2] # 取前2列
  12. y_p = data[:, 2] # 取前2列
  13. x = (sparse.csc_matrix((data[:,2], x_p.T)).astype(float))[:, :].todense()
  14. nUser = x.shape[0]
  15. #可视化矩阵
  16. pyplot.imshow(x, interpolation='nearest')
  17. pyplot.xlabel('用户')
  18. pyplot.ylabel('用户')
  19. pyplot.xticks(range(nUser))
  20. pyplot.yticks(range(nUser))
  21. pyplot.show()
  22. #使用默认的K-Means算法
  23. num_clusters = 2
  24. clf = KMeans(n_clusters=num_clusters, n_init=1, verbose=1)
  25. clf.fit(x)
  26. print(clf.labels_)
  27. #指定用户0与用户5作为初始化聚类中心
  28. init = np.vstack([ x[0], x[5] ])
  29. clf = KMeans(n_clusters=2, init=init)
  30. clf.fit(x)
  31. print(clf.labels_)

输出结果如下:

Initialization complete Iteration 0, inertia 581.000 Iteration 1, inertia 417.643 Converged at iteration 1 [0 0 1 1 1 1 1 1 1]

[0 0 0 0 1 1 1 1 1]

可以看到,使用默认的K-Means算法将使用随机的初始值,因此每次执行的结果都不一样。

上面的输出中将0,1用户聚类到一起,效果并不理想。然而,如果我们可以确定用户0与用户5是有很大区别的,就可以指定用户0和用户5作为K-Means聚类算法的初始值。可以看到和我们的预期完全一致,这样效果就非常好了。

由于K-Means毕竟是无监督学习,在很多情况下自然无法与有监督学习的算法进行同样标准的比较。但其不需要监督的特性,广泛应用与社交图谱(如本例)、相似性匹配(如搜索相似的新闻、帖子)等引用场景。

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-11-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

数据挖掘十大经典算法

1575
来自专栏码洞

人工稚能之sklearn数据降维

机器学习模型拟合的输入数据往往是多维数据,这个维度可能会非常庞大。比如统计一篇文章中的单词频率,就可以把文章看成单词的向量。而单词的数量又是非常庞大,每个单词都...

401
来自专栏AI研习社

如何使用 Keras 实现无监督聚类

由于深度学习算法在表达非线性表征上的卓越能力,它非常适合完成输入到有标签的数据集输出的映射。这种任务叫做分类。它需要有人对数据进行标注。无论是对 X 光图像还是...

1962
来自专栏技术沉淀

KNN算法实现及其交叉验证

1313
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 4 - 第一个机器学习问题

上一篇 3 机器人类学习的启示借鉴人类学习的模式,描绘了数据驱动的机器学习方法论:通过大量数据来确定模型,从而让模型具有预测价值。本篇提出第一个机器学习问题,...

3427
来自专栏专知

【干货】手把手教你Python实现自动贝叶斯调整超参数

【导读】机器学习中,调参是一项繁琐但至关重要的任务,因为它很大程度上影响了算法的性能。手动调参十分耗时,网格和随机搜索不需要人力,但需要很长的运行时间。因此,诞...

2045
来自专栏新智元

【周志华深度森林第二弹】首个基于森林的自编码器,性能优于DNN

【新智元导读】或许你还记得南大LAMDA教授周志华和学生冯霁在今年早些时候发表的“深度森林”论文,他们认为基于决策树集成的方法同样可以构建深度学习模型,并提出深...

3529
来自专栏开心的学习之路

机器学习项目流程及模型评估验证

4.9日到现在一直在做Udacity的P1项目——波士顿房价预测。这个项目让我收获最大的就是理清了机器学习解决问题的整体流程,搭起一个框架,学会了寻找模型的最优...

5377
来自专栏机器学习算法与Python学习

机器学习(14)之评价准则RoC与PR

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 前言 在机器学习的算法评估中,尤其...

3286
来自专栏人工智能

具有张量流的混合密度网络

不久之前,Google开源了TensorFlow,这是一个旨在简化图表计算的库。 主要的应用程序是针对深度学习,将神经网络以图形形式显示。 我花了几天的时间阅读...

4106

扫码关注云+社区