机器学习从入门到放弃K-Means聚类

前言

在本系列前面的内容中,讲述了一系列的机器学习方法。要知道机器学习算法中,比较常用的主要分成有监督学习无监督学习(其实还有一个叫半监督学习,在这里先不作讨论),简单点来说,所谓的有监督学习,就是人类会给训练集指明label,自然的无监督学习就是不为训练集指明label。所以本系列前段时间所说的就属于有监督学习

站在使用者的角度来说,两种模型的使用方法大致相同,都是我将测试样本输入模型,模型输出该样本所属的类别(这里以分类问题为例),但模型产生的方式是不同的。对于有监督学习来说,你重新训练一次样本1类还是那个1类,而对于无监督学习来说,你重新训练一次1类说不定就不是上次那个1类了,正是因为这个原因,所以在输出类别后,必要时需要输出同类别的其他样本,以作参考

正如当你老师跟你说了一堆三角形的例子你就知道这堂课说的就是三角形一样,没错,接下来就是为了讲述最基本的无监督学习的算法,K-Means聚类算法。

在这篇文章中,作者举了一个例子,将近年来各国球队的战绩进行聚类,分出世界一流,二流,三流球队,那么,显然当有一只新球队需要分类时,将他的战绩扔进模型里跑一跑就ok了。

其实聚类算法还有一个妙用就是,当数据集过于庞大,并且原始数据并不存在label信息,你又需要跑一个有监督学习的算法的时候,你想要人为的给数据打label显然是不合适的,这时先跑一次聚类,记录好聚类的情况,再直接跑有监督学习的算法就可以了。

K-Means

回到正题上,本文主要介绍K-Means方法,和为了弥补K-Means不足而产生的二分K-Means方法

以下讲解以二维数据为例。

普通的K-Means方法

  • 随机产生n个点为簇心,n的取值为用户需要的类别个数。

  • 计算所有样本离簇心的距离,计算方法有多种,其中包括最易理解的欧式距离sqrt((x1-y1)^2 +(x2-y2)^2)

  • 每一个样本都归纳到距离最近的簇心所在的类别。

  • 产生新的簇心,新的簇心计算方法为每一个簇内所有的样本的算术平均数。新簇心坐标(((x1+x2+……xn)/n),(y1+y2+……yn)/n))(x,y)为同一簇内样本点的坐标

  • 产生新的簇心后,按照新的簇心进行分类,若分类结果不变,则结束聚类,否则重复该过程至分类结果不变或超出用户指定的迭代次数。

普通K-Means有一个比较明显的缺陷,就是他的起始簇心是随机的。

随机意味这什么呢?一切皆有可能啊!

因为后续的质心迭代都是基于首次质心的选取,因此整体算法的结果和质心的选取极度敏感,虽然退一步来说,第一次聚类不理想,就重来算法一次好了,你可以重复运行至结果可接受位置,但这种方法显然是不能接受。于是便出现了二分K-Means算法。

二分K-Means方法

  • 以所有样本点的中心为第一个簇心

  • 判断当前簇心数是否满足要求,若满足则退出算法

  • 若不满足,则选取划分后误差最小的点一分为二(只有一个点时则选取自身)(一分为二的操作是指对该簇进行普通的K-Means方法)

  • 直至簇心个数满足要求。

代码实现

github

后话

自从开始这个机器学习从入门到放弃系列后,也多了一些关注者,最近文章更新缓慢我也有些抱歉,其实在github上已有其他算法的实现,心痒的同学可以先自行学习,因文章需要知识上的梳理和总结加上一些私事,所以更新会较慢,各位关注者见谅哈。

文章如有不足或不明白的地方,欢迎留言指教或探讨。


肥兔子de碎碎语
IT路上的成长历程。话题包括但不限于python,前端,Java,数据结构与算法,相关辅助工具等知识的总结和...

python忠实粉丝,贱贱的……

1.4k 声望
175 粉丝
0 条评论
推荐阅读
机器学习实战,使用朴素贝叶斯来做情感分析
前段时间更新了一系列基础的机器学习算法,感觉有些无味,而且恰好那时买了了国内某公司的云服务器,就打算部署一套文本处理的WEB API,顺别应用一下之前学习到的机器学习算法。(文末放出地址)

肥肥的兔子4阅读 11.2k评论 6

超详细的ChatGPT注册教程来了
最近一周,大家都在讨论ChatGPT,一些主流的技术社区更是将ChatGPT吹的神乎其技,那ChatGPT是什么呢?又能给我们带来哪些变化呢?。带着这些问题,我打算先注册并使用 ChatGPT,供想要体验 ChatGPT 的小伙伴们参考。

xiangzhihong1阅读 1.3k评论 1

Ubuntu20.04 从源代码编译安装 python3.10
Ubuntu 22.04 Release DateUbuntu 22.04 Jammy Jellyfish is scheduled for release on April 21, 2022If you’re ready to use Ubuntu 22.04 Jammy Jellyfish, you can either upgrade your current Ubuntu syste...

ponponon1阅读 4k评论 1

日常Python 代码片段整理
1、简单的 HTTP Web 服务器 {代码...} 2、单行循环List {代码...} 3、更新字典 {代码...} 4、拆分多行字符串 {代码...} 5、跟踪列表中元素的频率 {代码...} 6、不使用 Pandas 读取 CSV 文件 {代码...} 7、将列表...

墨城2阅读 354

Python + Sqlalchemy 对数据库的批量插入或更新(Upsert)
由于不同数据库对这种 upsert 的实现机制不同,Sqlalchemy 也就不再试图做一致性的封装了,而是提供了各自的方言 API,具体到 Mysql,就是给 insert statement ,增加了 on_duplicate_key_update 方法。

songofhawk1阅读 2.1k评论 4

封面图
Unicode 正则表达式(qbit)
前言本文根据《精通正则表达式》和 Unicode Regular Expressions 整理。本文的示例默认以 Python3 为实现语言,用到 Python3 的 re 模块或 regex 库。基本的 Unicode 属性分类 {代码...} 基本的 Unicode 子属性Le...

qbit阅读 4.4k

DeepMind 发布强化学习通用算法 DreamerV3,AI 成精自学捡钻石
内容一览:强化学习是多学科领域的交叉产物,其本质是实现自动决策且可做连续决策。本文将介绍 DeepMind 最新研发成果:扩大强化学习应用范围的通用算法 DreamerV3。关键词:强化学习 DeepMind 通用算法

超神经HyperAI1阅读 548

封面图

python忠实粉丝,贱贱的……

1.4k 声望
175 粉丝
宣传栏