前言
在前面的文章中,涉及到的机器学习算法均为监督学习算法。
所谓监督学习,就是有训练过程的学习。再确切点,就是有 "分类标签集" 的学习。
现在开始,将进入到非监督学习领域。从经典的聚类问题展开讨论。所谓聚类,就是事先并不知道具体分类方案的分类 (允许知道分类个数)。
本文将介绍一个最为经典的聚类算法 - K-Means 聚类算法以及它的两种实现。
现实中的聚类分析问题 - 总统大选
假设 M 国又开始全民选举总统了,目前 Mr.OBM 的投票率为48%(投票数占所有选民人数的百分比),而 Mr.MKN 的为47%,而剩下的一部分出于【种种原因】没有投票。
做为其中某个阵营的人,自然是希望能够尽可能的争取到这些剩余的票 -因为这完全可能影响最终选举结果。
然而,你不可能争取到这些人的所有投票,因为你满足某个群体的人,也许就伤害到了另一群人的利益。
一个很不错的想法是将这些人分为 K 个群体,然后主要对其中人数最多的几个群体做工作。
-- 这,就需要使用到聚类的策略了。
聚类策略是搜集剩余选民的用户信息(各种满意/不满意的信息),将这些信息输入进聚类算法,然后对聚类结果中人数最多的簇的选民做思想工作。
可能你会发现某个簇的选民都是一个社区的,一个宗教信仰的,或者具有某些共性。这样就方便各种各样的拉票活动了。
K-Means 聚类算法
K,指的是它可以发现 K 个簇;Means,指的是簇中心采用簇所含的值的均值来计算。
下面先给出伪代码:
1 创建 k 个点作为起始质心 (随机选择):2 当任意一个点的簇分配结果发生改变的时候:3 对数据集中的每个数据点:4 对每个质心:5 计算质心与数据点之间的距离6 将数据点分配到距其最近的簇7 对每一个簇:8 求出均值并将其更新为质心
然后是一个具体实现Python程序:
1 #!/usr/bin/env python
2 #-*- coding:UTF-8 -*-
3
4 '''
5 Created on 20**-**-**6
7 @author: fangmeng8 '''
9
10 from numpy import *
11
12 #==================================
13 #输入:
14 #fileName: 数据文件名(含路径)
15 #输出:
16 #dataMat: 数据集
17 #==================================
18 defloadDataSet(fileName):19 '载入