手写k-means算法
作为聚类的代表算法,k-means本属于NP难问题,通过迭代优化的方式,可以求解出近似解。
伪代码如下:

1,算法部分
距离采用欧氏距离。参数默认值随意选的。
import numpy as np
def k_means(x,k=4,epochs=500,delta=1e-3):
# 随机选取k个样本点作为中心
indices=np.random.randint(0,len(x),size=k)
centers=x[indices]
# 保存分类结果
results=[]
for i in range(k):
results.append([])
step=1
flag=True
while flag:
if step>epochs:
return centers,results
else:
# 合适的位置清空
for i in range(k):
results[i]=[]
# 将所有样本划分到离它最近的中心簇
for i in range(len(x)):
current=x[i]
min_dis=np.inf
tmp=0
for j in range(k):
distance=dis(current,centers[j])
if distance<min_dis:
min_dis=distance
tmp=j
results[tmp].append(current)
# 更新中心
for i in range(k):
old_center=centers[i]
new_center=np.array(results[i]).mean(axis=0)
# 如果新,旧中心不等,更新
# if not (old_center==new_center).all():
if dis(old_center,new_center)>delta:
centers[i]=new_center
flag=False
if flag:
break
# 需要更新flag重设为True
else:
flag=True
step+=1
return centers,results def dis(x,y):
return np.sqrt(np.sum(np.power(x-y,2)))
2,验证
我随机出了一些平面上的点,然后对其分类。
x=np.random.randint(0,50,size=100)
y=np.random.randint(0,50,size=100)
z=np.array(list(zip(x,y))) import matplotlib.pyplot as plt
%matplotlib inline plt.plot(x,y,'ro')
首先看看未分类之前的,当然也是跟分类后的分布是一样的。

然后看看分类后的结果:
centers,results=k_means(z) color=['ko','go','bo','yo']
for i in range(len(results)):
result=results[i]
plt.plot([res[0] for res in result],[res[1] for res in result],color[i])
plt.plot([res[0] for res in centers],[res[1] for res in centers],'ro')
plt.show()

可以看出,4个分类还是挺合理的。
再增加k=5试试,多执行几次看看。
centers,results=k_means(z,k=5) color=['ko','go','bo','yo','co']
for i in range(len(results)):
result=results[i]
plt.plot([res[0] for res in result],[res[1] for res in result],color[i])
plt.plot([res[0] for res in centers],[res[1] for res in centers],'ro')
plt.show()



可以看出,此算法对初值很敏感。
_^v^_
手写k-means算法的更多相关文章
- SpringCloud-Ribbon负载均衡机制、手写轮询算法
Ribbon 内置的负载均衡规则 在 com.netflix.loadbalancer 包下有一个接口 IRule,它可以根据特定的算法从服务列表中选取一个要访问的服务,默认使用的是「轮询机制」 Ro ...
- 面试题目:手写一个LRU算法实现
一.常见的内存淘汰算法 FIFO 先进先出 在这种淘汰算法中,先进⼊缓存的会先被淘汰 命中率很低 LRU Least recently used,最近最少使⽤get 根据数据的历史访问记录来进⾏淘汰 ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- HashMap+双向链表手写LRU缓存算法/页面置换算法
import java.util.Hashtable; class DLinkedList { String key; //键 int value; //值 DLinkedList pre; //双向 ...
- 搞定redis面试--Redis的过期策略?手写一个LRU?
1 面试题 Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2 考点分析 1)我往redis里写的数据怎么没了? 我们生产环境的redis怎么经常会丢掉一些数据?写进去了 ...
- 4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?
作者:中华石杉 面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当 ...
- OpenCV手写数字字符识别(基于k近邻算法)
摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...
- k最邻近算法——使用kNN进行手写识别
上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...
- 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...
- KNN (K近邻算法) - 识别手写数字
KNN项目实战——手写数字识别 1. 介绍 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法.它的工作原理是:存在一个 ...
随机推荐
- k8s安装flannel报错“node "master" pod cidr not assigned”
一.在安装flannel网络插件后,发现pod: kube-flannel-ds 一直是CrashLoopBackOff 此报错是因为安装Kubeadm Init的时候,没有增加 --pod-netw ...
- VUE-文本-事件-属性指令
一.Vue文本指令 文本指令: 1.{{ }} 2.v-text:不能解析html语法的文本,会原样输出 3.v-html:能解析html语法的文本 4.v-once:处理的标签的内容只能被解析一次 ...
- bootstrap面板的使用
<div class="panel panel-primary"> <div class="panel-heading"> 头部 < ...
- 苹果cms网站添加TV电视直播教程
1,首先添加一个新分类,分类的名称填写“电视直播”[状态:选启用].这里要注意下面的分类模板和播放模板需要修改一下名称.即在默认名称前面添加 " v_" 即v加下划线即可. 2,刚 ...
- 原生Js_简易图片轮播模板
功能:图片自动循环轮播,通过点击“上一张”,“下一张”按钮来控制图片的切换 <!DOCTYPE html> <html> <head> <meta chars ...
- RabbitMQ MQTT协议和AMQP协议
RabbitMQ MQTT协议和AMQP协议 1 序言... 1 1.1 RabbitMq结构... 1 1.2 RabbitMq消息接收... 4 1.3 Ex ...
- vue-loader+webpack配置项目流程
前提:安装了node.js与npm 1.建立一个npm项目 新建项目文件夹,打开终端,将路径移动至此文件夹,初始化输入 npm init 按照提示输入项目名称,描述,作者等信息(可回车跳过) 成功创建 ...
- Java中的基本数据类型和引用类型
一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...
- 【软件工程】团队Git现场编程实战
组长博客链接 博客链接 组员职责分工 队员 职责分工 恩泽 进行任务的划分与安排,调用API,负责餐饮商铺及商圈信息的获取 金海 解析API返回的json数据,提取有关信息 君曦 部分算法编写 季城 ...
- Ubuntu下qt5使用vlc
一:Ubuntu下在线安装qt5,同时安装了qt creator 二:打开终端执行sudo apt-get install libvlc5 libvlc-dev libvlccore-dev 安装 ...