机器学习

没有免费午餐定理和三大机器学习任务
如何对模型进行评估
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能够自主寻找样本数据的内部结构。
该算法是基于假设:特征空间中相近的两个样本很可能属于同一类别。

因为它所使用的数据不带有标签,所以毫无疑问是一种无监督学习方法。

其具备一下优点

  1. 可解释性好。
  2. 实现简单。
  3. 分类效果不错。

但是也存在一些缺点

  1. 准确度不如监督学习。
  2. 对K值的选择很敏感。

一、算法步骤

  1. 先定义有多少个簇/类别(cluster),即确定K值。
  2. 将每个簇心(中心)随机定在样本点上。
  3. 每个样本关联到最近的簇心上。
  4. 重新计算每个簇的簇心位置(取每个点坐标的平均值)。
  5. 更改簇心。
  6. 不停重复,直到簇心不变。

二、例子

该例子来自于【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均值聚类)原理及代码实现相关推荐

  1. 算法-聚类-K均值与模糊K均值:原理+python代码

    这篇文章是根据作业修改后得到的,个人感觉写的比较详细了.但还有许多不足,希望大家评论指出. K均值聚类与模糊K均值 1. 算法原理及流程 相关名词解释如表1. 表1-相关名词解释 1.1 K均值算法原 ...

  2. k均值聚类图像分割matlab代码_用K均值聚类法为人类拍摄的首张黑洞照片进行分割...

    众所周知,人类最近拍摄了首张黑洞照片.网友们纷纷表示,这明明就是一个甜甜圈嘛!以前以为黑洞是这个世界上最最高冷的存在,而此刻突然现出真身,形象却是如此的人畜无害!不但如此,还勾起了网友的食欲!简直是罪 ...

  3. k均值聚类的python代码_k-均值聚类Python代码实现

    这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...

  4. K-means均值聚类算法python代码实现

    import numpy as np import matplotlib.pyplot as plt import math import random import pandas as pd dat ...

  5. 基于K均值聚类的葡萄酒品种判别

    特别注意:主要思路.程序和分析过程来源于:https://www.kaggle.com/xvivancos/tutorial-clustering-wines-with-k-means.本文在此基础上 ...

  6. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  7. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  8. spss实现k均值聚类

    机器学习中的k均值聚类属于无监督学习,所谓k指的是簇类的个数,也即均值向量的个数.算法初始状态下,要根据我们设定的k随机生成k个中心向量,随机生成中心向量的方法既可以随机从样本中抽取k个样本作为中心向 ...

  9. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

最新文章

  1. 华为+长安研发芯片?长安蔚来更名“阿维塔科技”
  2. opencv std::vectorcv:Mat
  3. ZOJ4118 Stones in the Bucket
  4. PHP 递归删除目录中文件
  5. 【html笔记】html介绍和语法入门
  6. Python_日记 序列化和反序列化
  7. 51nod1433--简单数学
  8. 【数据分析学习笔记day26】自然语言处理NLTKPython文本分析工具NLTK 情感分析+ 文本相似度 +文本分类 +分类预测模型+朴素贝叶斯+ 实战案例+微博情感分析
  9. 智慧仓储管理系统实时仓储作业管理
  10. 删除或复制文件提示:文件名无效或太长/目标路径太长/找不到该项目
  11. Linux系统学习前的一些准备-Linux-学习笔记(二)
  12. 速卖通AE平台+聚石塔+奇门 完整教程V2
  13. 32.我的wafBypass之道
  14. 详解APP应用分发平台的榜单推荐和搜索排名规则
  15. Kafka-Steam Branch功能 对数据进行切分Steam,发送到指定的Topic
  16. 揭秘微信对方正在输入……到底表示什么意思?
  17. 关于hi3516ev100调试zbar二维码和链接wifi问题
  18. PPAPI插件的全屏切换处理
  19. FCBF算法的Matlab实现
  20. 淘宝/天猫平台商品详情API接口调用说明

热门文章

  1. [QNX 自适应分区用户指南]12 APS开发实践
  2. HDCP ---- 名词解释
  3. python期末大作业 邮箱小程序
  4. 【STM32—MDK-ARM】勾选了“Reset and Run”却不起作用,怎么办?
  5. layui实现后台管理系统界面(亲测可用)
  6. python调用微信客户端_用Python编写的简化版微信客户端
  7. CS231n-课程总结
  8. 技术出身能做好管理吗?——能!
  9. MySQL8.0Clone插件
  10. rabbitmq guest/guest用户不能远程登录