当前位置: 首页 > news >正文

无监督学习算法Kmeans

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():# step1: 首先用sklearn包生成训练集模板(这里的簇心为4)# 生成合成数据# n_samples是待生成的样本总数# centers 表示要生成的样本中心(类别)数,或是确定的中心点数量blobs = make_blobs(n_samples=200, random_state=1, centers=4)X_blobs = blobs[0]      # 提取特征数据Y_blobs = blobs[1]      # 类别plt.figure(1)plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=Y_blobs)# step2# step3: 聚类kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, max_iter=300, random_state=None, )kmeans.fit(X_blobs)# step4: plotx_min, x_max = X_blobs[:, 0].min() - 0.5, X_blobs[:, 0].max() + 0.5y_min, y_max = X_blobs[:, 1].min() - 0.5, X_blobs[:, 1].max() + 0.5# step5xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.figure(2)plt.clf()plt.imshow(Z, interpolation='hermite', extent=(xx.min(), xx.max(), yy.min(), yy.max()), cmap=plt.cm.winter,aspect='auto', origin='lower')plt.plot(X_blobs[:, 0], X_blobs[:, 1], 'w.', markersize=5)# 用红色的x表示簇中心centroids = kmeans.cluster_centers_plt.scatter(centroids[:, 0], centroids[:, 1], marker="x", s=150, linewidths=3, color='r', zorder=10)plt.xlim(x_min, x_max)plt.ylim(y_min, y_max)plt.xticks()plt.yticks()plt.show()if __name__ == '__main__':main()

http://www.lryc.cn/news/175191.html

相关文章:

  • 区块链(4):区块链技术模型介绍
  • go语言 rune 类型
  • DS18B20温度传感器
  • LeetCode322. 零钱兑换
  • AUTOSAR扫盲贴--不是黑神话【基本概念和方法论】
  • python抠图(去水印)开源库lama-cleaner入门应用实践
  • Nginx可视化管理工具结合cpolar实现远程访问内网服务
  • CCC数字钥匙设计【BLE】 --建立安全测距
  • Ubuntu22.04 Opencv4.5.1 CPU和GPU编译攻略,Opencv CPU和GPU编译保姆教程 亲自测试。
  • 常识判断 --- 党史
  • Rust 基础再理解
  • Opencv cuda版本在ubuntu22.04中安装办法,解决Could NOT find CUDNN的办法
  • 全网首发YOLOv8暴力涨点:Gold-YOLO,遥遥领先,超越所有YOLO | 华为诺亚NeurIPS23
  • BD就业复习第四天
  • 数据结构 | 树
  • Android11 适配
  • UML基础与应用之对象图
  • 英码科技精彩亮相火爆的IOTE 2023,多面赋能AIoT产业发展!
  • 400G QSFP-DD FR4 与 400G QSFP-DD FR8光模块:哪个更适合您的网络需求?
  • 【Android】Kotlin 中的 apply、let、with、also、run 到底有啥区别?
  • 设计模式——职责链模式
  • 小程序自定义tabbar,中间凸起
  • 数据结构-顺序栈C++示例
  • 若依cloud -【 100 ~ 103 】
  • 可转债实战与案例分析——成功的和失败的可转债投资案例、教训与经验分享
  • @NotNull注解不生效,全局异常处理
  • 【办公自动化】使用Python一键往Word文档的表格中填写数据(文末送书)
  • OpenHarmony应用核心技术理念与需求机遇简析
  • 让Pegasus天马座开发板实现超声波测距
  • C++11 多线程学习