机器学习--k均值聚类(k-means)算法

一、基本原理

分类是指分类器根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类。分类被称为监督学习。如果训练集的样本没有标注类别,那么就需要用到聚类。聚类是把相似的样本聚成一类,这种相似性通常以距离来度量。聚类被称为无监督学习。

聚类是指根据“物以类聚”的原理,将本身没有类别的样本聚集成不同的组,这样的一组数据对象的集合叫做簇,并且对每一个这样的簇进行描述的过程。它的目的是使得属于同一个簇的样本之间应该彼此相似,而不同簇的样本应该足够不相似。与分类规则不同,进行聚类前并不知道将要划分成几个组和什么样的组,也不知道根据哪些空间区分规则来定义组。

k-means是聚类算法中常用的一种,其中k的含义是指有k个cluster(簇)。由聚类的定义可知,一个样本应距离其所属cluster的质心是最近的(相较于其他k-1个cluster)。为了表示cluster,最简单有效的是取所有样本点平均,即质心(cluster centroid),这便是取名means的来由。

二、算法流程

1)随机选取k个初始点作为质心

2)计算每个点到k个质心的距离,并将其分给距离最近的质心所对应的簇

3)更新每个簇的质心,直到簇分配不发生改变为止

伪代码表示如下:

创建k个点作为起始质心(可以随机选择)

当任意一个点的簇分配结果发生改变时

对数据集中的每个数据点

对每个质心

计算质心与数据点之间的距离

将数据点分配到距其最近的簇

对每一个簇,计算簇中所有点的均值并将均值作为质心

三、算法的特点

优点:容易实现

缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢。

适用数据范围:数值型。

四、python代码实现

1、将文本文件转换为矩阵

#############################

#功能:将文本文件导入到矩阵中

#输入变量:文本文件

#输出变量:文本文件转换后的矩阵

#############################

def load_data_set(file_name):

data_mat = []

fr = open(file_name)

for line in fr.readlines():

#先去除字符串两边的空格,再以tab分隔符分切字符串

cur_line = line.strip().split(‘\t‘)

#用map函数将cur_line进行float运算,即转为float型

float_line = map(float, cur_line)

data_mat.append(float_line)

fr.close()

return data_mat

2、欧式距离的计算

############################

#功能:计算欧式距离

#输入变量:两个变量

#输出变量:两个变量的欧氏距离

############################

def dist_eclud(vec_a, vec_b):

return sqrt(sum(power(vec_a-vec_b, 2)))

3、构建一个k个随机质心的集合

##################################

#功能:构建一个k个随机质心的集合

#输入变量:原始数据集,初始化为k个质心

#输出变量:质心的坐标值

##################################

def rand_cent(data_set, k):

n = shape(data_set)[1]  # 获得列数

centroids = mat(zeros((k, n)))  # 创建k行n列的质心矩阵,初始值都为0

for j in xrange(n):  # 创建每个维度范围内的随机集群中心

min_j = min(data_set[:, j])  # 取出对应列的值,并取最小值

range_j = float(max(data_set[:, j]) - min_j)

# 生成0到1.0之间的随机数,确保随机点在数据的边界之内

centroids[:, j] = min_j + range_j*random.random()

return centroids

4、实现k-均值聚类算法

##################################

#功能:k均值聚类

#输入变量:原始数据集,初始化为k个质心,

# 距离函数,构建随机质心的函数

#输出变量:centroids 最终的质心,

# cluster_assment 每个质心包含的数据点的索引值及误差

##################################

def k_means(data_set, k):

m = shape(data_set)[0]  # 获得行数

cluster_assment = mat(zeros((m, 2)))  # 一列记录簇索引值,一列存储误差

centroids = rand_cent(data_set, k)  # 生成随机质心

cluster_changed = True

while cluster_changed:

cluster_changed = False

for i in xrange(m):  # 计算每一个数据点到质心的距离

min_dist = inf

min_index = -1

# 计算每个数据点到质心的最小距离

for j in xrange(k):

dist_ji = dist_eclud(centroids[j, :], data_set[i, :])

if dist_ji < min_dist:

min_dist = dist_ji

min_index = j

# 如果该数据点的索引值改变,即该数据点不属于原来的质心

if cluster_assment[i, 0] != min_index:

cluster_changed = True

# 最小值的索引值,均方值

cluster_assment[i, :] = min_index, min_dist**2

print ‘centroids=‘, centroids

for cent in xrange(k):

# 去第一列等于cent的所有列

# nonzero()返回值为元组,两个值分别为两个维度,第一个是行,第二个是列。

# .A表示返回该矩阵数据的2维数组视图

pts_in_clust = data_set[nonzero(cluster_assment[:, 0].A == cent)[0]]

centroids[cent, :] = mean(pts_in_clust, axis=0)

return centroids, cluster_assment

def main():

data_mat = mat(load_data_set(‘testSet.txt‘))

# print "data_mat=", data_mat

centroids = rand_cent(data_mat, 2)

print "centroids=", centroids

my_centroids, cluster_assing = k_means(data_mat, 4)

print ‘my_centroids=‘, my_centroids

print ‘cluster_assing=‘, cluster_assing

if __name__ == ‘__main__‘:

main()

时间: 2024-08-02 11:03:39

机器学习--k均值聚类(k-means)算法的相关文章

聚类之K均值聚类和EM算法

这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means)是一种基于中心的聚类算法,通过迭代,将样本分到K个类中,使得每个样本与其所属类的中心或均值的距离之和最小. 1.定义损失函数 假设我们有一个数据集{x1, x2,..., xN},每个样本的特征维度是m维,我们的目标是将数据集划分为K个类别.假定K的值已经给定,那么第k个类别的中心定义为μk,k=1

机器学习实战笔记-利用K均值聚类算法对未标注数据分组

聚类是一种无监督的学习,它将相似的对象归到同一个簇中.它有点像全自动分类.聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好 簇识别给出聚类结果的含义.假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么.聚类与分类的最大不同在于,分类的目标事先巳知,而聚类则不一样.因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类(unsupervised classification ). 聚类分析试图将相似对象归人同一簇,将不相似对象归到不

k-均值聚类算法;二分k均值聚类算法

根据<机器学习实战>一书第十章学习k均值聚类算法和二分k均值聚类算法,自己把代码边敲边理解了一下,修正了一些原书中代码的细微差错.目前代码有时会出现如下4种报错信息,这有待继续探究和完善. 报错信息: Warning (from warnings module): File "F:\Python2.7.6\lib\site-packages\numpy\core\_methods.py", line 55 warnings.warn("Mean of empty

机器学习实战5:k-means聚类:二分k均值聚类+地理位置聚簇实例

k-均值聚类是非监督学习的一种,输入必须指定聚簇中心个数k.k均值是基于相似度的聚类,为没有标签的一簇实例分为一类. 一 经典的k-均值聚类 思路: 1 随机创建k个质心(k必须指定,二维的很容易确定,可视化数据分布,直观确定即可): 2 遍历数据集的每个实例,计算其到每个质心的相似度,这里也就是欧氏距离:把每个实例都分配到距离最近的质心的那一类,用一个二维数组数据结构保存,第一列是最近质心序号,第二列是距离: 3 根据二维数组保存的数据,重新计算每个聚簇新的质心: 4 迭代2 和 3,直到收敛

机器学习之路:python k均值聚类 KMeans 手写数字

python3 学习使用api 使用了网上的数据集,我把他下载到了本地 可以到我的git中下载数据集: https://github.com/linyi0604/MachineLearning 代码: 1 import numpy as np 2 import pandas as pd 3 from sklearn.cluster import KMeans 4 from sklearn import metrics 5 6 ''' 7 k均值算法: 8 1 随机选择k个样本作为k个类别的中心

[机器学习][K-Means] 无监督学习之K均值聚类

有监督学习虽然高效.应用范围广,但最大的问题就是需要大量的有标签的数据集,但现实生活中我们遇到的大量数据都是没有明确标签的,而且对于庞大的数据集进行标注工作本身也是一项费时费力的工作模式,所以我们希望找到一种方法能自动的挖掘数据集中各变量的关系,然后"总结"出一些规律和特征进行分类,这样的方法我们成为无监督学习(Unsupervised learning). 在无标签的数据集中进行分类的方法成为聚类.顾名思义,聚类就是依照某种算法将相似的样本聚在一起形成一类,而不管它的标签是什么.在聚

K均值聚类算法

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心.聚类中心以及分配给它们的对象就代表一个聚类.每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算.这个过程将不断重复直到满足某个终止条件.终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小.

k均值聚类

目录 一.k均值简介 二.应用简介 三.算法 四.选择合适的K 五.具体实例 一.k均值简介 K均值聚类是一种无监督学习,对未标记的数据(即没有定义类别或组的数据)进行分类. 该算法的目标是在数据中找到由变量K标记的组.该算法迭代地工作基于所提供的特征,将每个数据点分配给K个组中的一个. 基于特征相似性对数据点进行聚类. K均值聚类算法的结果是: 1.K簇的质心,可用于标记新数据 2.训练数据的标签(每个数据点分配给一个集群) 二.应用简介 K均值聚类算法用于查找未在数据中明确标记的组.这可用于

第十篇:K均值聚类(KMeans)

前言 本文讲解如何使用R语言进行 KMeans 均值聚类分析,并以一个关于人口出生率死亡率的实例演示具体分析步骤. 聚类分析总体流程 1. 载入并了解数据集:2. 调用聚类函数进行聚类:3. 查看聚类结果描述:4. 将聚类结果图形化展示:5. 选择最优center并最终确定聚类方案:6. 图形化展示不同方案效果并提交分析报表. 人口出生/死亡率聚类分析 - K均值聚类 1. 载入并了解数据集 1.1 从网上下载一份txt格式的关于人口出生率统计的数据(countries.txt).其内容大致如下