机器学习极简入门笔记-5-无监督学习-K-means

news2025/1/18 1:59:50

目录

第17章 KNN算法(有监督学习算法,放在此位置是为了与下一章的K-means做对比)

17.1 KNN算法原理

17.2 KNN中的K

第18章 K-means——最简单的聚类算法

18.1 K-means算法步骤

18.2 K-means算法具体细节

18.3 启发式算法

18.4 K-means算法的局限性

18.5 K-means算法代码实现

18.6 KNN实例


第17章 KNN算法(有监督学习算法,放在此位置是为了与下一章的K-means做对比

17.1 KNN算法原理

KNN算法的基本思想是:

  • 训练数据包括样本的特征向量(x)和标签(y)
  • K是一个常数,由用户来定义
  • 一个没有标签的样本进入算法后,首先找到与它距离最近的K个样本,然后用它的K个最近邻的标签来确定它的标签。

KNN 算法的步骤如下。

  • 算距离:给定未知对象,计算它与训练集中的每个样本的距离。在特征变量连续的情况下,将欧氏距离作为距离度量;若特征是离散的,也可以用重叠度量或者其他指标作为距离,这要结合具体情况分析。
  • 找近邻:找到与未知对象距离最近的K个训练样本。
  • 做分类/回归:将在这K个近邻中出现次数最多的类别作为未知对象的预测类别(多数表决法),或者是取K个近邻的目标值平均数,作为未知对象的预测结果。

多数表决法有个问题,如果训练样本的类别分布不均衡,那么出现频率较多的样本将会主导预测结果。这一问题的解决办法有多种,其中常见的一种是:不再简单计算K个近邻中的多数。而是同时考虑K个近邻的距离,K个近邻中每一个样本的类别(或目标值)都以距离的倒数为权值,最后求全体加权结果


17.2 KNN中的K

在KNN算法中,假设训练样本一共有m个,当一个待预测样本进来的时候,它要与每一个训练样本进行距离计算,然后从中选出K个最近的邻居,根据这 K个近邻标签确定自己的预测值。

此处的K是一个正整数。若K=1,则该对象的预测值直接由最近的一个样本确定。若 K=m,则整个训练集共同确定待测样本。

通常K>1,但也不会太大,是一个“较小”的正整数。具体取何值最佳,则取决于训练数据和算法目标。

在一般情况下,K值越大,受噪声的影响越小;但K值越大,也越容易模糊类别之间的界限

比如下图所示的这个例子,用 KNN 做分类,黑色为A类,蓝色为B 类,五角星的是待测样本

当我们取K=3时,根据多数选举法,预测结果为 B;但当K=6时,依然是根据多数选举法,预测结果就成了A。可见,K的取值大小直接影响着算法的结果。


第18章 K-means——最简单的聚类算法

18.1 K-means算法步骤

算法步骤

  • Step0:用户确定K值,并将n个样本投射为特征空间中的n个点(K≤n)。
  • Step1:算法在这n个点中随机选取K个点,作为初始的簇核心。
  • Step2:分别计算每个样本点到K个簇核心的距离(一般取欧氏距离或余弦距离),找到离该点最近的簇核心,将它归到对应的簇。
  • Step 3:所有点都归属到簇之后,n个点就分为了 K个簇。之后重新计算每个簇的重心,将其定为新的簇核心。
  • Step4:反复迭代Step2~Step3,直到簇核心不再移动。

18.2 K-means算法具体细节

目标

有n个样本x1,x2,…,xn,每个都是d维实向量,K-means聚类的目标是将它们分为K簇(K≤n),这些簇表示为S={S1,S2,…,Sk}。

K-means算法的目标是簇内平方和最小:

分配

更新

对于该簇中的样本求均值即可


18.3 启发式算法

启发式算法是一种基于直观或经验构造的算法。相对于最优化算法要求得待解决问题的最优解,启发式算法力求在可接受的花费(消耗的时间和空间)下,给出待解决问题的一个可行解,该可行解与最优解的偏离程度一般不能被预计。启发式算法常能发现不错的解,但也没办法证明它不会得到较坏的解,它通常可在合理时间内解出答案,但也没办法知道它是否每次都能够以这样的速度求解

虽然有种种不确定性,且其性能无法得到严格的数学证明,但启发式算法直观、简单、易于实现。在某些特殊情况下,启发式算法会得到很坏的答案或效率极差,不过造成那些特殊情况的数据组合也许永远不会在现实世界出现。因此现实世界中常用启发式算法来解决问题。

最常见的用于实现 K-means 的启发式算法为 Lloyd’s 算法。Lloyd’s算法是一种很高效的算法,通常它的时间复杂度是O(nkdi),其中n为样本数,k为簇数,d为样本维度数,而i为从开始到收敛的迭代次数。

如果样本数据本身就有一定的聚类结构,那么收敛所需的迭代次数通常是很少的,而且一般前几十次迭代之后,每次迭代的改进就很小了。

因此,在实践中,Lloyd’s算法往往被认为是线性复杂度的算法,虽然在最糟糕的情况下时间复杂度是超多项式的。

目前,Lloyd’s 算法是 K-means 聚类的标准方法。当然,每一次迭代它都要计算每个簇中各个样本到簇核心的距离,这是很耗费算力的。不过在大多数情况下,经过头几轮的迭代,各个簇就相对稳定了,大多数样本不会再改变簇的归属,可以利用缓存等方法来简化后续的计算。


18.4 K-means算法的局限性

K-means 简单直观,有了启发式算法后,计算复杂度也可以接受,但存在以下问题。

  • K值对最终结果的影响很大,而它却必须预先给定。给定合适的K值需要先验知识很难凭空估计,否则可能导致效果很差。
  • 初始簇核心很重要,几乎可以说是算法敏感的,偏偏它们一般是被随机选定的。一旦选择得不合适,就只能得到局部最优解。当然,这也是由K-means 算法本身的局部最优性决定的。
  • K-means 存在的问题造成了K-means的应用有限,使得它并不适合所有的数据。例如,对于非球形簇,或者多个簇之间尺寸和密度相差较大的情况,K-means 就处理不好了。

18.5 K-means算法代码实现

训练样本是10个人的身高体重数据

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

X = np.array([[185.4, 72.6], [155.0, 54.4], [170.2, 99.9], [172.2, 97.3], [157.5, 59.0], [190.5, 81.6], [188.0, 77.1], [167.6, 97.3], [172.7, 93.3], [154.9, 59.0]])

kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
y_kmeans = kmeans.predict(X)
centroids = kmeans.cluster_centers_

plt.scatter(X[:, 0], X[:, 1], s=50);
plt.yticks(())
plt.show()

plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='black', s=200, alpha=0.5);
plt.show()

 运行结果为

我们预测下两个新的样本

print(kmeans.predict([[170.0,60],[155.0,50]]))

(注意,原书这里代码有点错误,应该是kmeans,而非K-means)

输出结果为

[1 1]


18.6 KNN实例

我们没必要手动打标签,因为我们可以利用上一节K-means的结果作为KNN的标签

from sklearn.neighbors import KNeighborsClassifier
X = [[185.4, 72.6],
[155.0, 54.4],
[170.2, 99.9],
[172.2, 97.3],
[157.5, 59.0],
[190.5, 81.6],
[188.0, 77.1],
[167.6, 97.3],
[172.7, 93.3],
[154.9, 59.0]]
y = [0, 1, 2, 2, 1, 0, 0, 2, 2, 1]
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)


print(neigh.predict([[170.0, 60], [155.0, 50]]))

运行结果

[1 1]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/10041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

介绍a股level2数据接口委托队列的作用

a股level2数据接口可以实现量化交易的准确性,那用户在交易的过程中会发现在“委托队列”中,如果出现一些有规律性的单子,往往是主力之间的盘口暗语。 例如排在靠前的都是大单,封单相当坚决,如果细心一点还会发现都是拖…

Spring Security 自定义拦截器Filter实现登录认证

前言 需求来源: 微信小程序获取授权码code, 通过授权码code, 获取微信用户信息(比如openid,unionId), 并记录登录状态(比如token信息的获取); 原本打算使用Spring Security中OAuth2.0的机制 实现用小程序登录,发现小程序再已经获取授权码code登录流程和Spring Secu…

Intellij插件之~图形界面Swing UI Designer

资料 Java Swing 介绍 JavaFX快速入门 Java Swing 图形界面开发简介 GUI Designer Basics scrcpy ScrcpyController Services 创建一个Gui Form文件(类form文件) 创建一个Gui Form 此时生成两个类, 是自动关联的 鼠标可以拖入控件,每拖入一个组件,在TestForm…

领悟《信号与系统》之 信号与系统的描述-下节

信号与系统的描述-下节一、信号的基本运算1. 信号的基本运算1. 加法 、减法2. 乘法、除法3. 微分 、差分4.积分、迭分2. 关于时间(自变量)的运算1. 位移2. 反折3. 尺度变换二、阶跃信号与冲激信号1. 单位阶跃信号2. 单位阶跃信号的特性3. 单位冲激信号4.…

Android架构师学习必备学习宝典《Android架构开发手册》

吐槽 我想每个程序员在写代码的时候可能都有这些历程(夸张): 这坨代码谁写的,怎么要这样写啊,我这个需求该怎么加代码!(尝试在shit山上小心地走,并添加新代码)写的好难受,shit越改越chou了…算了&#xf…

协程设计原理

文章目录1、协程的背景1.1、同步与异步1.2、为什么使用协程1.3、协程的适用场景2、协程的原语操作3、协程的切换3.1、汇编实现4、协程的定义4.1、多状态集合设计4.2、调度器的定义4.2、调度策略生产者消费者模式多状态运行5、api 封装5.1、hook 机制5.2、hook 函数原型5.3、hoo…

React笔记——github案例(用到axios 和 pubsub)

案例github用上脚手架配置代理 1.完成静态页面构建 小技巧:先在原html页面搜索最外侧框 是否有样式存在,如果样式不存在则不需要剪切过去 给需求或效果分好组件,分别是 Search 和 List 、App 组件 class都改为 className 给图片添加上特定…

JS高级(二):继承、数组的一些api、Object.defineProperty()、call、apply、bind

JavaScript高级(二)一、继承1.call方法改变this指向2.构造函数中模拟类的super实现属性继承3.构造函数借助原型对象实现方法继承4.类的本质二、ES5几个新增方法1.数组forEach()2.数组filter()3.数组some()4.字符串trim()三、Object.definProperty()四、改…

基于STM32结合CubeMX学习Free-RT-OS的源码之深入学习软件定时器实现过程

概述 关于在CUBEMX上的配置 介绍 软件定时器基于硬件定时器实现。 软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数,被定时器 调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期,…

什么是需求分析,如何进行需求分析?

目录 前言 需求分析在分析什么 如何看待产品原型设计 技术同学培养产品意识 如何应对需求变更问题 总结 重点:配套学习资料和视频教学 前言 这篇文章,我会将软件工程中关于需求分析相关的知识进行总结梳理,并以自己理解的方式进行阐述…

iNFTnews|风口之上,耐克推出的web3平台.SWOOSH能否引领市场?

本周一,著名的体育运动品牌耐克宣布,公司将进一步进军Web3,并将发布一个旨在通过旗下的数字可穿戴设备吸引用户的新平台——.SWOOSH。 耐克表示,.SWOOSH将成为Web3教育的资源库,以及购买和交易虚拟运动鞋或运动衫等数…

Oracle SQL执行计划操作(3)——物化视图相关操作

3. 物化视图相关操作 该类操作与SQL语句执行计划中访问物化视图数据的路径和方式相关,主要包括物化视图访问类相关操作。根据不同的具体SQL语句及其他相关因素,如下各操作可能会出现于相关SQL语句的执行计划。 1)MAT_VIEW ACCESS FULL 对物化视图(Materialized View)直…

培训学校的教务管理系统存在的问题有哪些?

教务管理在培训学校管理里面占据不可或缺的地位。随着计算机、网络、大数据、人工智能等技术的发展,国家对智慧校园的重视,促进了培训学校教务管理信息化与智慧化建设。然而,随着科技进步速度不断加快,教育改革步伐的不断加大&…

解决:将Ubuntu系统打包成ios镜像并制作U盘系统

将Ubuntu系统打包成ios镜像并制作U盘系统一、安装 Systemback二、将创建的.sblive镜像文件转为.iso格式三、写入U盘进行安装四、制作系统U盘一、安装 Systemback Currently supported Ubuntu releases: - 14.04.X LTS - 15.04 - 15.10 - 16.04.X LTS - 16.10Systemback的作者在…

linux的基本指令(中)

文章目录1.man指令1.安装2.用法3.man数字1. printf函数的查询2.cp指令1.cp 文件1.拷贝到当前目录2.拷贝到 其他目录中3. 拷贝到上一级目录2.cp 目录1.返回上一级目录3. mv指令1.剪切2. 文件的重命名4. cat指令1.显示文件的全部内容并且不可以修改2.cat -n指令3. cat -s 指令5. …

6张思维导图,搞定项目管理!(PMP项目管理可用)

工作中,我们最常遇到的就是大大小小的工作项目。项目要怎么做,才能100%达成目标呢? 小哈总结了6组项目管理思维导图。只要从五大阶段掌握诀窍,用项目管理的思维去管理工作,工作就能有条不紊按预期达到目标&#xff0c…

GitHub Codespaces 安装 .NET 7

本文主要介绍如何在 GitHub Codespaces 这个云上 IDE 环境中安装 .NET 7 背景 GitHub 的 Codespaces 可以让我们随时随地编写代码,一些简单的修改也非常方便快捷。特别是 .NET 7 发布后,一些可以直接升级的小项目只需要更改配置就可以了,我们…

EN 14915实木镶板和包层—CE认证

实木镶板和包层CE认证(欧盟强制认证)-简介 在欧盟市场“CE”标志属强制性认证标志,以表明产品符合欧盟《技术协调与标准化新方法》指令的基本要求。这是欧盟法律对产品提出的一种强制性要求。 在实木镶板和包层上加贴CE标志不但可…

Active Directory报表计划

ADManager Plus的“计划报表”功能是一个独有模块,可使报表生成实现自动化。IT管理员现在可为任何所需的时间段(从一个小时到一个月)计划报表。因而,计划功能可提供一致、准确的报表交付,而不会产生任何麻烦和费用。本…

【ESP32_8266_WiFi (十三)】ESP8266自动配网 – WiFiManager库使用说明

文章目录ESP8266自动配网 – WiFiManager库使用说明1 WiFiManager库使用说明1.1 WiFi配置流程1.2 WiFi配置示例程序1.2.1 预备程序 – 清理ESP8266储存的WiFi连接信息1.2.2 WiFiManager网络配置示例程序1.2.3 WiFiManager网络配置测试2 WiFiManager库汉化和定制说明2.1 WiFiMan…