K-Means(K均值聚类)原理及代码实现
机器学习
没有免费午餐定理和三大机器学习任务
如何对模型进行评估
K-Means(K均值聚类)原理及代码实现
KNN(K最近邻算法)原理及代码实现
KMeans和KNN的联合演习
文章目录
- 机器学习
- 前言
- 一、算法步骤
- 二、例子
- 1. K=2 选取P3和P4作物簇心
- 2.计算每个点到簇心的距离
- 3. 更新簇心。
- 3. 再次计算每个点到簇心的距离。
- 三、代码实现
- 1. 导入必要的库
- 2. K-Means实现
- 3. 绘制分类图(二维情况下)
- 4. 运行代码
- 四、测试结果
前言
K-Means算法是机器学习中一个非常简单且使用的聚类算法。其只具备一个超参数K,代表着样本的类别数。
假设k=2则表示我们希望将样本分为两类,另外k-means能够自主寻找样本数据的内部结构。
该算法是基于假设:特征空间中相近的两个样本很可能属于同一类别。
因为它所使用的数据不带有标签,所以毫无疑问是一种无监督学习方法。
其具备一下优点
- 可解释性好。
- 实现简单。
- 分类效果不错。
但是也存在一些缺点:
- 准确度不如监督学习。
- 对K值的选择很敏感。
一、算法步骤
- 先定义有多少个簇/类别(cluster),即确定K值。
- 将每个簇心(中心)随机定在样本点上。
- 每个样本关联到最近的簇心上。
- 重新计算每个簇的簇心位置(取每个点坐标的平均值)。
- 更改簇心。
- 不停重复,直到簇心不变。
二、例子
该例子来自于【10分钟算法系列】K均值聚类算法-带例子/K-Means Clustering Algorithm
1. K=2 选取P3和P4作物簇心
P3是第一类的中心(红色)。
P4是第一类的中心(绿色)。
2.计算每个点到簇心的距离
此处D(Cn)2D(C_n)^2D(Cn)2表示样本点到第n个簇心的距离的平方(简化计算)。
其中点 P1, P3, P5是一类, P2, P4, P6是另一类。
3. 更新簇心。
3. 再次计算每个点到簇心的距离。
所有样本所属的簇没有改变,所有簇心不变,循环结束,分类完成。
三、代码实现
1. 导入必要的库
import random
import sys
import numpy as np
import matplotlib.pyplot as plt
2. K-Means实现
class KMeans(object):def __init__(self, input_data, k):# data是一个包含所有样本的numpy数组# data示例,每行是一个坐标# [[1 2],# [2 3],# [3 4]]self.data = input_dataself.k = k# 保存聚类中心的索引和类样本的索引self.centers = []self.clusters = []self.capacity = len(input_data)self.__pick_start_point()def __pick_start_point(self):# 随机确定初始簇心self.centers = []if self.k < 1 or self.k > self.capacity:raise Exception("K值错误")indexes = random.sample(np.arange(0, self.capacity, step=1).tolist(), self.k)for index in indexes:self.centers.append(self.data[index])def __distance(self, i, center):diff = self.data[i] - centerreturn np.sum(np.power(diff, 2))**0.5def __calCenter(self, cluster):# 计算该簇的中心cluster = np.array(cluster)if cluster.shape[0] == 0:return Falsereturn (cluster.T @ np.ones(cluster.shape[0])) / cluster.shape[0]def cluster(self):changed = Truewhile changed:self.clusters = []for i in range(self.k):self.clusters.append([])for i in range(self.capacity):min_distance = sys.maxsizecenter = -1# 寻找簇for j in range(self.k):distance = self.__distance(i, self.centers[j])if min_distance > distance:min_distance = distancecenter = j# 加入簇self.clusters[center].append(self.data[i])newCenters = []for cluster in self.clusters:newCenters.append(self.__calCenter(cluster).tolist())if (np.array(newCenters) == self.centers).all():changed = Falseelse:self.centers = np.array(newCenters)
3. 绘制分类图(二维情况下)
def plotKmeans(cluster):xdata = []ydata = []for Cluster in cluster.clusters:xsubdata = []ysubdata = []for point in Cluster:xsubdata.append(point[0])ysubdata.append(point[1])xdata.append(xsubdata)ydata.append(ysubdata)colors = ['r', 'g', 'b', 'c', 'm', 'y', 'k']for i in range(len(xdata)):for j in range(len(xdata[i])):x = np.array([xdata[i][j], cluster.centers[i][0]])y = np.array([ydata[i][j], cluster.centers[i][1]])plt.plot(x, y,color=colors[i], # 全部点设置为红色marker='o', # 点的形状为圆点ms=7,linestyle='-')plt.plot([cluster.centers[i][0]], [cluster.centers[i][1]],color=colors[i], # 全部点设置为红色marker='*', ms=20, # 点的形状为圆点linestyle='-')plt.scatter(cluster.centers[i][0], cluster.centers[i][1], s=350, c='none',alpha=0.7, linewidth=1.5, edgecolor=colors[i])plt.grid(True)plt.title("K-means")plt.show()
4. 运行代码
from KMeans import KMeans, plotKmeans
import random
import numpy as npif __name__ == '__main__':points = []data = []i = 0while i < 20:point = [random.randint(1, 10), random.randint(1, 10)]# 去掉重复点,否则会导致错误if point not in points:points.append(point)data.append(np.array(point, dtype='float64'))i += 1cluster = KMeans(data, 3)cluster.cluster()plotKmeans(cluster)
四、测试结果
K-Means(K均值聚类)原理及代码实现相关推荐
- 算法-聚类-K均值与模糊K均值:原理+python代码
这篇文章是根据作业修改后得到的,个人感觉写的比较详细了.但还有许多不足,希望大家评论指出. K均值聚类与模糊K均值 1. 算法原理及流程 相关名词解释如表1. 表1-相关名词解释 1.1 K均值算法原 ...
- k均值聚类图像分割matlab代码_用K均值聚类法为人类拍摄的首张黑洞照片进行分割...
众所周知,人类最近拍摄了首张黑洞照片.网友们纷纷表示,这明明就是一个甜甜圈嘛!以前以为黑洞是这个世界上最最高冷的存在,而此刻突然现出真身,形象却是如此的人畜无害!不但如此,还勾起了网友的食欲!简直是罪 ...
- k均值聚类的python代码_k-均值聚类Python代码实现
这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...
- K-means均值聚类算法python代码实现
import numpy as np import matplotlib.pyplot as plt import math import random import pandas as pd dat ...
- 基于K均值聚类的葡萄酒品种判别
特别注意:主要思路.程序和分析过程来源于:https://www.kaggle.com/xvivancos/tutorial-clustering-wines-with-k-means.本文在此基础上 ...
- 聚类分析 | MATLAB实现k-Means(k均值聚类)分析
目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...
- 机器学习之无监督学习-K均值聚类算法
机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...
- spss实现k均值聚类
机器学习中的k均值聚类属于无监督学习,所谓k指的是簇类的个数,也即均值向量的个数.算法初始状态下,要根据我们设定的k随机生成k个中心向量,随机生成中心向量的方法既可以随机从样本中抽取k个样本作为中心向 ...
- 为了联盟还是为了部落 | K means
1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...
最新文章
- 华为+长安研发芯片?长安蔚来更名“阿维塔科技”
- opencv std::vectorcv:Mat
- ZOJ4118 Stones in the Bucket
- PHP 递归删除目录中文件
- 【html笔记】html介绍和语法入门
- Python_日记 序列化和反序列化
- 51nod1433--简单数学
- 【数据分析学习笔记day26】自然语言处理NLTKPython文本分析工具NLTK 情感分析+ 文本相似度 +文本分类 +分类预测模型+朴素贝叶斯+ 实战案例+微博情感分析
- 智慧仓储管理系统实时仓储作业管理
- 删除或复制文件提示:文件名无效或太长/目标路径太长/找不到该项目
- Linux系统学习前的一些准备-Linux-学习笔记(二)
- 速卖通AE平台+聚石塔+奇门 完整教程V2
- 32.我的wafBypass之道
- 详解APP应用分发平台的榜单推荐和搜索排名规则
- Kafka-Steam Branch功能 对数据进行切分Steam,发送到指定的Topic
- 揭秘微信对方正在输入……到底表示什么意思?
- 关于hi3516ev100调试zbar二维码和链接wifi问题
- PPAPI插件的全屏切换处理
- FCBF算法的Matlab实现
- 淘宝/天猫平台商品详情API接口调用说明