机器学习:K-Means聚类算法
本文来自同步博客。
前面几篇文章介绍了回归或分类的几个算法,它们的共同点是训练数据包含了输出结果,要求算法能够通过训练数据掌握规律,用于预测新输入数据的输出值。因此,回归算法或分类算法被称之为监督学习(Supervised Learning)。
本篇文章将接触有别于监督学习的另一类机器学习算法——无监督学习(Unsupervised Learning)。无监督学习是寻找缺乏标准答案的输入数据的规律。其中聚类算法是无监督学习主要的分支。今天介绍的K-Means算法就是聚类算法的其中一种比较常见的算法。
K-Means算法原理
K-Means算法的K指的是输出类别的数目。该算法是一个迭代过程,每一次迭代分为两个步骤,第一步为分类成簇,第二步为移动簇中心,直到簇中心不变。
分类成簇的判定方法是将与簇中心的欧几里得距离最小的数据点归为对应的一类。而簇中心的计算方式是该类所有数据点的平均值,这就是均值‘Mean’一词的由来。
下图演示了K-Means算法每一次迭代数据点的分类情况:

可以从上图看到,K-Means经过4次迭代就完成了聚类过程。每次迭代,圆圈表示的数据点都被分类到离它最近的“x”表示的中心点,然后对中心点进行了更新。
K-Means算法实现
下面的代码展示了K-Means算法的原理,上面的图片也是通过这块代码生成的。依旧通过注释方式讲代码,请看:
import numpy as np
import matplotlib.pyplot as plt # Input data set
X = np.array([
[-4, -3.5], [-3.5, -5], [-2.7, -4.5],
[-2, -4.5], [-2.9, -2.9], [-0.4, -4.5],
[-1.4, -2.5], [-1.6, -2], [-1.5, -1.3],
[-0.5, -2.1], [-0.6, -1], [0, -1.6],
[-2.8, -1], [-2.4, -0.6], [-3.5, 0],
[-0.2, 4], [0.9, 1.8], [1, 2.2],
[1.1, 2.8], [1.1, 3.4], [1, 4.5],
[1.8, 0.3], [2.2, 1.3], [2.9, 0],
[2.7, 1.2], [3, 3], [3.4, 2.8],
[3, 5], [5.4, 1.2], [6.3, 2]
]) # K-Means
def k_means(data, k=2):
if not isinstance(k, int) or k <= 0 or len(data) < k:
return # Select first K points as centroids
centroids = {0: data[0], 1: data[1]} # configurations
limit = 0.0001
max_loop_count = 300
total_steps = []
# Loop
for i in range(max_loop_count):
# Classification data into K groups
groups = {} for j in range(k):
groups[j] = [] for item in data:
dist = [np.linalg.norm(centroids[centroid] - item) for centroid in centroids]
index = dist.index(min(dist))
groups[index].append(item) # Calculate new centroids
new_centroids = [np.average(groups[i], axis=0) for i in groups]
# Store data for matplotlib
total_steps.append({
'loop': i,
'groups': groups,
'centroids': centroids.copy()
}) # Check whether they change or not
stop_loop = True
for c in centroids:
if abs(np.sum((new_centroids[c] - centroids[c])/centroids[c]*100.0)) > limit:
stop_loop = False
break if stop_loop:
break # Update centroids
for c in centroids:
centroids[c] = new_centroids[c] # Draw pictures
colors = k*['g', 'r', 'b', 'c', 'm', 'y', 'k', 'w']
fig = plt.figure()
for step in total_steps:
# This may cause error if len(total_steps) > 9
ax = fig.add_subplot(1, len(total_steps), step['loop'] + 1)
for g in step['groups']:
for point in step['groups'][g]:
ax.scatter(point[0], point[1], s=20, color=colors[g])
ax.scatter(step['centroids'][g][0], step['centroids'][g][1], marker='x', s=30, color=colors[g])
plt.show() k_means(X)
scikit-learn中的KMeans
scikit-learn中的KMeans存在cluster模块中,在官方有关KMeans的API文档中可以看到,数据处理结果存放在‘cluster_centers_’、‘labels_’和‘ inertia_’中。下面用到了前两者,分别是聚类中心点和标签。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans # Input data set
X = np.array([
[-4, -3.5], [-3.5, -5], [-2.7, -4.5],
[-2, -4.5], [-2.9, -2.9], [-0.4, -4.5],
[-1.4, -2.5], [-1.6, -2], [-1.5, -1.3],
[-0.5, -2.1], [-0.6, -1], [0, -1.6],
[-2.8, -1], [-2.4, -0.6], [-3.5, 0],
[-0.2, 4], [0.9, 1.8], [1, 2.2],
[1.1, 2.8], [1.1, 3.4], [1, 4.5],
[1.8, 0.3], [2.2, 1.3], [2.9, 0],
[2.7, 1.2], [3, 3], [3.4, 2.8],
[3, 5], [5.4, 1.2], [6.3, 2]
]) clf = KMeans(n_clusters=2)
clf.fit(X)
centroids = clf.cluster_centers_
labels = clf.labels_ colors = ['r', 'g']
for i in range(len(X)):
plt.scatter(X[i][0], X[i][1], color=colors[labels[i]], s=20)
plt.scatter(centroids[:, 0], centroids[:, 1], marker='x', s=30)
plt.show()
执行结果如下:

机器学习:K-Means聚类算法的更多相关文章
- 机器学习实战---K均值聚类算法
		
一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...
 - 机器学习六--K-means聚类算法
		
机器学习六--K-means聚类算法 想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别 ...
 - k均值聚类算法原理和(TensorFlow)实现
		
顾名思义,k均值聚类是一种对数据进行聚类的技术,即将数据分割成指定数量的几个类,揭示数据的内在性质及规律. 我们知道,在机器学习中,有三种不同的学习模式:监督学习.无监督学习和强化学习: 监督学习,也 ...
 - K均值聚类算法
		
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个 ...
 - 机器学习中K-means聚类算法原理及C语言实现
		
本人以前主要focus在传统音频的软件开发,接触到的算法主要是音频信号处理相关的,如各种编解码算法和回声消除算法等.最近切到语音识别上,接触到的算法就变成了各种机器学习算法,如GMM等.K-means ...
 - Mahout机器学习平台之聚类算法具体剖析(含实例分析)
		
第一部分: 学习Mahout必需要知道的资料查找技能: 学会查官方帮助文档: 解压用于安装文件(mahout-distribution-0.6.tar.gz),找到例如以下位置.我将该文件解压到win ...
 - 【Python机器学习实战】聚类算法(1)——K-Means聚类
		
实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...
 - 基于改进人工蜂群算法的K均值聚类算法(附MATLAB版源代码)
		
其实一直以来也没有准备在园子里发这样的文章,相对来说,算法改进放在园子里还是会稍稍显得格格不入.但是最近邮箱收到的几封邮件让我觉得有必要通过我的博客把过去做过的东西分享出去更给更多需要的人.从论文刊登 ...
 - K均值聚类算法的MATLAB实现
		
1.K-均值聚类法的概述 之前在参加数学建模的过程中用到过这种聚类方法,但是当时只是简单知道了在matlab中如何调用工具箱进行聚类,并不是特别清楚它的原理.最近因为在学模式识别,又重新接触了这 ...
 
随机推荐
- HDUOJ---2546 饭卡
			
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
 - 让你的APP和你的服务器畅快通讯
			
做安卓开发有很多时候都是要和web交互的,我们很难制作本地应用,这次把小弟整出来的安卓和服务器通讯贡献出来,希望能帮到需要的朋友,同时也是加深印象. 我们先来搭建安卓客户端,首先写好布局文件: 1.布 ...
 - iOS - UIMenuController
			
前言 NS_CLASS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED @interface UIMenuController : NSObject 1.UIMenuCont ...
 - 【Linux】X window与文本模式的切换
			
Linux默认的情况下会提供六个Terminal来让使用者登陆,切换的方式为:[Ctrl] + [Alt] + [F1]~[F6]的组合按钮.那这六个终端接口如何命名呢,系统会将[F1] ~ [F6] ...
 - python学习笔记014——错误和异常
			
Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...
 - AME_IExpense费用报表通过AME审批简单例子(案例)
			
2014-05-30 Created By BaoXinjian
 - fork函数相关总结
			
fork的作用是根据一个现有的进程复制出一个新进程,原来的进程称为父进程(Parent Process),新进程称为子进程(Child Process).系统中同时运行着很多进程,这些进程都是从最初只 ...
 - Java WebService 简单实例(转
			
一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1.创建[Web Service Project],命名为[TheService ...
 - java与java学习路线
			
JAVA学习路线图 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面 ...
 - 基于FPGA的线阵CCD实时图像采集系统
			
基于FPGA的线阵CCD实时图像采集系统 2015年微型机与应用第13期 作者:章金敏,张 菁,陈梦苇2016/2/8 20:52:00 关键词: 实时采集 电荷耦合器件 现场可编程逻辑器件 信号处理 ...