一、概念

K-means是一种典型的聚类算法,它是基于距离的,是一种无监督的机器学习算法。

K-means需要提前设置聚类数量,我们称之为簇,还要为之设置初始质心。

缺点:

1、循环计算点到质心的距离,复杂度较高。

2、对噪声不敏感,即使是噪声也会被聚类。

3、质心数量及初始位置的选定对结果有一定的影响。

二、计算

K-means需要循环的计算点到质心的距离,有三种常用的方法:

1、欧式距离

欧式距离源自N维欧氏空间中两点x,y间的距离公式,在二维上(x1,y1)到(x2,y2)的距离体现为:

在三维上体现为:

欧式距离是K-means最常用的计算距离的方法。

2、曼哈顿距离

在二维上(x1,y1)到(x2,y2)的距离体现为:

3、余弦夹角

余弦距离不是距离,而只是相似性,其他距离直接测量两个高维空间上的点的距离,如果距离为0则两个点“相同”;
余弦的结果为在[-1,1]之中,如果为 1,只能确定两者完全相关、完全相似。

在二维上(x1,y1)到(x2,y2)的距离体现为:

聚类的基本步骤:

1、设置质心个数,这代表最终聚类数;

2、根据质心个数随机生成初始质心点;

3、计算数据与质心距离,根据距离远近做第一次分类;

4、将聚类结果的中心点定义为新的质心,再进行3的计算;

5、循环迭代直到质心不再变化,此为最终结果。

3、实现

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt def create_sample():
np.random.seed(10) # 随机数种子,保证随机数生成的顺序一样
n_dim = 2
num = 100
a = 3 + 5 * np.random.randn(num, n_dim)
b = 18 + 4 * np.random.randn(num, n_dim)
data_mat = np.concatenate((a, b))
ay = np.zeros(num)
by = np.ones(num)
label = np.concatenate((ay, by))
return {'data_mat': data_mat, 'label': label} # arr[i, :] #取第i行数据
# arr[i:j, :] #取第i行到第j行的数据
# in:arr[:,0] # 取第0列的数据,以行的形式返回的
# in:arr[:,:1] # 取第0列的数据,以列的形式返回的 def k_mean(data_set, k):
m, n = np.shape(data_set) # 获取维度, 行数,列数
cluster_assignment = np.mat(np.zeros((m, 2))) # 转换为矩阵, zeros生成指定维数的全0数组,用来记录迭代结果
centroids = generate_centroids(k, n)
cluster_changed = True
while cluster_changed:
cluster_changed = False
for i in range(m):
min_distance = np.inf # 无限大的正数
min_index = -1
vec_b = np.array(data_set)[i, :] # i行数据,数据集内的点的位置
for j in range(k):
vec_a = np.array(centroids)[j, :] # j行数据, 中心点位置
distance = calculate_distance(vec_a, vec_b)
if distance < min_distance:
min_distance = distance
min_index = j
if cluster_assignment[i, 0] != min_index:
cluster_changed = True
cluster_assignment[i, :] = min_index, min_distance ** 2
update_centroids(data_set, cluster_assignment, centroids, k)
get_result(data_set, cluster_assignment, k) def generate_centroids(centroid_num, column_num):
centroids = np.mat(np.zeros((centroid_num, column_num))) # 生成中心点矩阵
for index in range(centroid_num):
# 随机生成中心点, np.random.rand(Random values in a given shape)
centroids[index, :] = np.mat(np.random.rand(1, column_num))
return centroids def calculate_distance(vec_a, vec_b):
distance = np.sqrt(sum(np.power(vec_a - vec_b, 2))) # power(x1, x2) 对x1中的每个元素求x2次方。不会改变x1上午shape。
return distance def update_centroids(data_set, cluster_assignment, centroids, k):
for cent in range(k):
# 取出对应簇
cluster = np.array(cluster_assignment)[:, 0] == cent
# np.nonzero取出矩阵中非0的元素坐标
pts_in_cluster = data_set[np.nonzero(cluster)]
# print(pts_in_cluster)
# mean() 函数功能:求取均值
# 经常操作的参数为axis,以m * n矩阵举例:
# axis : 不设置值, m * n 个数求均值,返回一个实数
# axis = 0:压缩行,对各列求均值,返回1 * n矩阵
# axis = 1 :压缩列,对各行求均值,返回m * 1矩阵
if len(pts_in_cluster) > 0:
centroids[cent, :] = np.mean(pts_in_cluster, axis=0) def get_result(data_set, cluster_assignment, k):
cs = ['r', 'g', 'b']
for cent in range(k):
ret_id = np.nonzero(np.array(cluster_assignment)[:, 0] == cent)
plot_data(data_set[ret_id], cs[cent])
plt.show() def plot_data(samples, color, plot_type='o'):
plt.plot(samples[:, 0], samples[:, 1], plot_type, markerfacecolor=color, markersize=14) data = create_sample()
k_mean(data['data_mat'], 2)

聚类结果:

机器学习聚类算法之K-means的更多相关文章

  1. Standford机器学习 聚类算法(clustering)和非监督学习(unsupervised Learning)

    聚类算法是一类非监督学习算法,在有监督学习中,学习的目标是要在两类样本中找出他们的分界,训练数据是给定标签的,要么属于正类要么属于负类.而非监督学习,它的目的是在一个没有标签的数据集中找出这个数据集的 ...

  2. 机器学习——KNN算法(k近邻算法)

    一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...

  3. 机器学习聚类算法之DBSCAN

    一.概念 DBSCAN是一种基于密度的聚类算法,DBSCAN需要两个参数,一个是以P为中心的邻域半径:另一个是以P为中心的邻域内的最低门限点的数量,即密度. 优点: 1.不需要提前设定分类簇数量,分类 ...

  4. 机器学习分类算法之K近邻(K-Nearest Neighbor)

    一.概念 KNN主要用来解决分类问题,是监督分类算法,它通过判断最近K个点的类别来决定自身类别,所以K值对结果影响很大,虽然它实现比较简单,但在目标数据集比例分配不平衡时,会造成结果的不准确.而且KN ...

  5. 机器学习中K-means聚类算法原理及C语言实现

    本人以前主要focus在传统音频的软件开发,接触到的算法主要是音频信号处理相关的,如各种编解码算法和回声消除算法等.最近切到语音识别上,接触到的算法就变成了各种机器学习算法,如GMM等.K-means ...

  6. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记

    机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记 关键字:k-均值.kMeans.聚类.非监督学习作者:米仓山下时间: ...

  7. 数据挖掘十大算法--K-均值聚类算法

    一.相异度计算  在正式讨论聚类前,我们要先弄清楚一个问题:怎样定量计算两个可比較元素间的相异度.用通俗的话说.相异度就是两个东西区别有多大.比如人类与章鱼的相异度明显大于人类与黑猩猩的相异度,这是能 ...

  8. 03-01 K-Means聚类算法

    目录 K-Means聚类算法 一.K-Means聚类算法学习目标 二.K-Means聚类算法详解 2.1 K-Means聚类算法原理 2.2 K-Means聚类算法和KNN 三.传统的K-Means聚 ...

  9. 机器学习实战---K均值聚类算法

    一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...

随机推荐

  1. python MySQLdb 如何设置读超时read_timeout

    在python中,经常用到 MySQLdb操作MySQL数据库. 在实现上,MySQLdb并不是纯python的,而是封装了MySQL C API库_mysql. 对于MySQLdb是否支持read_ ...

  2. mingw下的msys显示与输入乱码

    一直很喜欢gcc+vim这个貌似已经不用在强调了,好了,我只是想说明下我的问题是首先从gcc编译出错提示开始的 正如上面所说,安装完MinGW后使用gcc一编译,这程序没有错误还好,这一有错误发现输入 ...

  3. Linux-ubuntu命令-文件、磁盘管理

    .文件管理 <1>查看文件信息:ls ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,它类似于DOS下的dir命令. Linux文件或者目录名称最长可以有26 ...

  4. 阶段3 2.Spring_08.面向切面编程 AOP_10 总结和作业安排

    由转账添加事物,使得我们的操作变的非常麻烦.重复代码产生了很多 实际的开发中如果想记录日志每个方法都要执行 如果判断用户是否登陆也是每个方法都需要判断 这些重复的代码我们都需要去解决. 解决的方式,以 ...

  5. properties文件的加载方式

    下面1-4的内容是网上收集的相关知识,总结来说,就是如下几个知识点: 最常用读取properties文件的方法 InputStream in = getClass().getResourceAsStr ...

  6. linux:vi替换命令

    linux:vi替换命令 vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询 ...

  7. matlab2012a过期问题解决办法(转载)

    转载:http://blog.sina.com.cn/s/blog_4a46812b0102x694.html   以前安装过Matlab2013a等高版本,发现自己win7 系统每次重启后,Matl ...

  8. Cocos2d-X多线程(2) 线程的互斥量std::mutex和线程锁

    多个线程同时访问共享资源时,经常会出现冲突等.为了避免这种情况的发生,可以使用互斥量,当一个线程锁住了互斥量后,其他线程必须等待这个互斥量解锁后才能访问它. thread提供了四种不同的互斥量: 1. ...

  9. Ubuntu16.04安装NVIDIA驱动、实现GPU加速

    NVIDIA驱动前前后后装了好几遍,下面把个人的经验分享下,大家仅供参考. 老规矩,先引用师兄的(最详细)https://blog.csdn.net/sinat_23853639/article/de ...

  10. AndroidStudio ADB WIFI :adb wifi scan ip address

    笔记本使用Android studio的adb wifi插件时,AS 最下方报 adb wifi scan ip address.一直无法使用. 解决办法: ----在Terminal窗口中输入: a ...