无监督学习算法Kmeans

news/2025/3/25 12:14:51/

1. 有监督学习和无监督学习

在机器学习算法中,常把算法分为有监督学习和无监督学习两种。他们之间的区别主要在于输入数据集类型学习目标

(1)有监督学习:训练输入的数据需要带有标签,以便算法能够学习输入和输出之间的映射关系;有监督学习的目标是通过对训练数据的学习,实现对未知数据的预测和分类。

(2)无监督学习:训练数据不需要标签,算法只能使用输入数据进行学习,目标是找到输入数据之间的相似性和区别。

这里我们要介绍的Kmeans聚类算法,就是一种无监督学习算法,输入的训练数据不需要类别标签,而是通过计算数据点之间的相似性来对数据进行分类。

2. Kmeans算法原理

这个算法的目标是最小化每个聚类内的距离和,即使得每个点与其所在聚类中心的距离之和最小。它尝试使得每个聚类尽可能小,并且不同聚类之间的距离尽可能大。

  • K-means聚类算法的原理是:

(1) 首先随机选择K个点作为初始的聚类中心;

(2)然后计算每个点到聚类中心的距离,将每个点分配到离它最近的聚类中心所在的簇中;

(3)对于每个簇,计算每个簇所有点的平均值,并将其作为新的聚类中心点;

(4)重复这个过程,直到聚类中心不再发生变化,或者达到预设的迭代次数。

  • K值如何确定

K值是一个重要的超参数,表示簇的个数,即要把数据分为几个类别。

K值的确定可以通过以下几种方法:

肘部法:肘部法所使用的聚类评价指标为数据集中所有样本点到其簇中心的距离之和的平方。

轮廓系数法:轮廓系数是一种非常常用的聚类效果评价指标。

可视化数据:最常用最简单的方法是可视化数据,然后观察出聚类聚成几类比较合适。

交叉验证:计算不同k值下KMeans算法的BIC和AIC值,BIC或AIC值越小,选择该k值。

3. 运行代码

import matplotlib.pyplot as plt
import sklearn
import numpy as npfrom sklearn.datasets import make_blobs
from sklearn.cluster import KMeansdef main():# 用sklearn包生成训练集数据(这里的簇心为4)blobs = make_blobs(n_samples=200, random_state=1, centers=4)X_blobs = blobs[0]      # 提取特征数据# Y_blobs = blobs[1]      # 类别标签plt.figure(1)plt.title('Input points')plt.scatter(X_blobs[:, 0], X_blobs[:, 1])kmeans = KMeans(n_clusters=2, init='k-means++', n_init=10, max_iter=300, random_state=None, )kmeans.fit(X_blobs)output = kmeans.predict(X_blobs)print('output: ', output)plt.figure(2)plt.title('K = 2')plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=output)# 用红色的x表示簇中心centroids = kmeans.cluster_centers_plt.scatter(centroids[:, 0], centroids[:, 1], marker="x", s=150, linewidths=3, color='r', zorder=10)plt.xticks()plt.yticks()plt.show()if __name__ == '__main__':main()

结果如下图所示:

第一张图为输入的二维数据,第二张图为K=2时的聚类效果,第三张图为K=4时的聚类效果。可以看到Kmeans算法能达到较好的聚类效果


http://www.ppmy.cn/news/1125503.html

相关文章

Qt/C++音视频开发55-加密保存到文件并解密播放

一、前言 为了保证视频文件的安全性,有时候需要对保存的视频文件加密,然后播放的时候解密出来再播放,只有加密解密的秘钥一致时才能正常播放,用ffmpeg做视频文件的加密保存和解密播放比较简单,基于ffmpeg强大的字典参数设计,在avformat_write_header写入头部数据的时候,…

Zorin OS 16.3 发布:无缝升级和卓越改进

导读Zorin OS 团队自豪地宣布了备受期待的 Zorin OS 16.3 版本的发布,这是这个受欢迎的 Linux 发行版的一个里程碑版本。自首次发布以来不到两年时间,Zorin OS 已经获得了庞大的用户群体,截至目前已经有 530 万次下载,而 16.3 版本…

Oracle的EXISTS

--EXISTS 是 sql中的一个条件运算符,它用于判断一个子查询是否返回了一个结果集,如果返回结果集,则返回true ,否则返回 False EXISTS 语法:SELECT 字段名 FROM 表1 WHERE 筛选条件 AND EXISTS( SELECT 1 FROM 表2 WHERE 值1 值2 -- 关联的字段 AND 筛选条件 ) 查询那个部门…

Android 滑动事件消费监控,Debug 环境下通用思路

Android Debug 环境下滑动事件消费监控通用思路 背景 Android 开发中,经常会遇到滑动事件冲突。在一些简单的场景下,我们如果能够知道是那个 View 拦截了事件,那我们能够很容易得解决。解决方法通常就是内部拦截法或者外部拦截法。ViewPage…

基于jquery开发的Windows 12网页版

预览 https://win12.gitapp.cn 首页代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"refresh" content"0;urldesktop.html" /> <meta name"viewport&…

Linux 入门:基本指令

本篇文章来介绍我们在初学Linux时可以会碰倒的一些基本指令&#xff0c;让我们对这些指令有一个基本的了解。 目录 01. ls 指令 02. pwd 命令 03. cd 指令 04. touch 指令 05. mkdir 指令&#xff08;重要&#xff09; 06. rmdir指令 && rm 指令&#xff08;重…

Nginx的反向代理、动静分离、负载均衡

反向代理 反向代理是一种常见的网络技术&#xff0c;它可以将客户端的请求转发到服务器群集中的一个或多个后端服务器上进行处理&#xff0c;并将响应结果返回给客户端。反向代理技术通常用于提高网站的可伸缩性和可用性&#xff0c;并且可以隐藏真实的后端服务器地址。 #user…

执行上下文,js、React、HTML中的this

目录 执行上下文属性&#xff1a;变量对象、this&#xff0c;作用域链 变量对象是与执行上下文相关的数据作用域&#xff0c;存储&#xff1a;变量、函数声明 执行上下文生命周期 创建&#xff1a;生成变量对象、创建函数作用域&#xff0c;建立作用域链、确定this的指向 …