为了便于可视化,样本数据为随机生成的二维样本点。

from matplotlib import pyplot as plt
import numpy as np
import random def kmeans(a, k):
def randomChoose(a, k):
# 从数组a中随机选取k个元素,返回一个list
args = np.arange(len(a)) # 元素下标
for i in range(k):
x = np.random.randint(i, len(a))
args[x], args[i] = args[i], args[x] # 交换两个数
return a[args[:k]] # 返回前k个元素 def tag(a, center):
dis = np.empty((len(a), len(center)),dtype=np.float)
for i in range(len(a)):
for j in range(len(center)):
dis[i][j] = np.linalg.norm(a[i] - center[j])
label = np.argmin(dis, axis=1)
return label def get_center(a, label,k):
centers = np.empty((k,a.shape[1]),dtype=np.float)
for i in range(len(centers)):
centers[i] = np.mean(a[label == i],axis=0)
return centers
centers = randomChoose(a, k)
last_label = None
label = tag(a, centers)
while last_label is None or np.any(last_label != label):
# print(centers)
# input()
last_label = label
centers = get_center(a, label,k)
label=tag(a,centers)
return label,centers a = np.random.random((100, 2))
print(a)
c=['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w']
k=len(c)
label,centers=kmeans(a,k)
a=a.T
fig,ax=plt.subplots(3,3)
ax=ax.reshape(-1)
#需要注意,如果不把全局画出来,看上去聚类效果很差,因为matplot自动缩放坐标轴
for i in range(k):
x,y=a[:,label==i]
ax[i].scatter(x,y,c=c[i])
ax[i].scatter(centers[:,0],centers[:,1],c='r')
ax[-1].set_title("Centers")
ax[-1].scatter(centers[:,0],centers[:,1])
plt.show()

K均值算法有很多可以变化的地方:

  • 在求新的聚类中心时,可以直接修改旧的聚类中心

    这样类似于迭代法求解线性方程组时的“高斯-赛德尔”迭代法。

    这样也可以节省一点点空间,不过没必要。
  • 点之间距离的计算

    可以用差向量的范数,也可以用余弦距离。

K均值算法可以用于分类。

首先指定聚类个数K,执行聚类算法得到K个聚类,给这K个聚类进行打标签(也就是进行投票,这相当于K近邻算法的投票阶段),预测时计算测试样本离哪个聚类最近,就表示该测试样本的类别。

这样做的好处是,吸收了K近邻的优点,并且降低了时间复杂度(K近邻需要计算测试样本与N个训练样本之间的距离,K均值分类只需要计算测试样本与K个聚类中心之间的距离)。

特别地,当聚类个数K=N的时候,K均值分类就变成了K近邻分类。

下面分析一下KMeans的时空复杂度。

N个样本,每个样本M个属性,聚类个数为K

空间复杂度为O(K*M),只需要存储下来中心点即可

时间复杂度为

  • 更新各点的label,复杂度为O(NKM),需要计算N*K次长度为M的向量模长
  • 重新求中心距离,复杂度为O(N*M),需要计算N次长度为M的向量之和

所以,总的时间复杂度为O(NKM)

K均值算法的更多相关文章

  1. 聚类算法:K-means 算法(k均值算法)

    k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设 ...

  2. 一句话总结K均值算法

    一句话总结K均值算法 核心:把样本分配到离它最近的类中心所属的类,类中心由属于这个类的所有样本确定. k均值算法是一种无监督的聚类算法.算法将每个样本分配到离它最近的那个类中心所代表的类,而类中心的确 ...

  3. 聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

    1.用python实现K均值算法 import numpy as np x = np.random.randint(1,100,20)#产生的20个一到一百的随机整数 y = np.zeros(20) ...

  4. 【机器学习】K均值算法(I)

    K均值算法是一类非监督学习类,其可以通过观察样本的离散性来对样本进行分类. 例如,在对如下图所示的样本中进行聚类,则执行如下步骤 1:随机选取3个点作为聚类中心. 2:簇分配:遍历所有样本然后依据每个 ...

  5. Bisecting KMeans (二分K均值)算法讲解及实现

    算法原理 由于传统的KMeans算法的聚类结果易受到初始聚类中心点选择的影响,因此在传统的KMeans算法的基础上进行算法改进,对初始中心点选取比较严格,各中心点的距离较远,这就避免了初始聚类中心会选 ...

  6. KMeans (K均值)算法讲解及实现

    算法原理 KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标 ...

  7. 聚类分析K均值算法讲解

    聚类分析及K均值算法讲解 吴裕雄 当今信息大爆炸时代,公司企业.教育科学.医疗卫生.社会民生等领域每天都在产生大量的结构多样的数据.产生数据的方式更是多种多样,如各类的:摄像头.传感器.报表.海量网络 ...

  8. K均值算法-python实现

    测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点 ...

  9. spark Bisecting k-means(二分K均值算法)

    Bisecting k-means(二分K均值算法) 二分k均值(bisecting k-means)是一种层次聚类方法,算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二.之后选择能最大程 ...

随机推荐

  1. 免费桌面视频录像工具OBS的简单操作介绍

    本帖最后由 felix0911 于 2014-5-21 09:32 编辑 0起点,傻瓜操作,为什么不尝试录制一个自己的游戏视频,来展现自己牛逼风骚的操作呢?(本教学不包括后期制作,特效背景音乐等部分) ...

  2. SpringBoot-Mybatis_Plus学习记录之公共字段自动填充

    一.应用场景 平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦.mybatisPlus有一个很好 ...

  3. light oj 1007 Mathematically Hard (欧拉函数)

    题目地址:light oj 1007 第一发欧拉函数. 欧拉函数重要性质: 设a为N的质因数.若(N % a == 0 && (N / a) % a == 0) 则有E(N)=E(N ...

  4. jedis 连接 redis:Could not get a resource from the pool——我的出错原因和解决办法

    windows 下安装的,本机使用 现象:刚装好开发使用好好的, 重启电脑后就报这个错 网上的所有可能都试过,没有用. 最后,放弃所有包装,用最原始的代码进行连接测试: Jedis jedis=new ...

  5. 【R】函数-数学函数

  6. 【python3】集合set (转)

    https://www.cnblogs.com/onepeace/p/4791578.html set原理 Python 还 包 含 了 一 个 数 据 类 型—— set ( 集 合 ) . 集 合 ...

  7. 一分钟读懂互联网广告竞价策略GFP+GSP+VCG

    原文:http://ju.outofmemory.cn/entry/116780 一分钟读懂互联网广告竞价策略GFP+GSP+VCG 两个广告位,三家广告主竞价,广告平台究竟应该制定广告竞价策略呢?这 ...

  8. 关于 redis 报错 :JsonParseException: Unrecognized token 'xxx': was expecting ('true', 'false' or 'null')

    在使用java  读取redis存储的数据时出现 JsonParseException: Unrecognized token 'xiaoqiang': was expecting ('true', ...

  9. OSX下安装VMware虚拟机, 加载kali系统

    准备 当前环境:OSX 10.11.6 , 准备VMware虚拟机软件和kali系统 为什么要安装kali系统 Kali Linux预装了许多渗透测试软件,包括nmap (端口扫描器).Wiresha ...

  10. 使用Swashbuckle.AspNetCore生成.NetCore WEBAPI的接口文档

    一.问题 使用Swashbuckle.AspNetCore生成.NetCore WEBAPI的接口文档的方法 二.解决方案 参考文章:https://docs.microsoft.com/zh-cn/ ...