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

机器学习:k均值

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。

在“无监督学习”中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础,较为经典的是聚类。

**聚类试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”。**聚类既能作为一个单独过程,用于找寻数据内在的分布结构,也可以作为分类等其他学习任务的前驱过程。

距离计算:

  • 连续属性及离散有序属性:闵可夫斯基距离:
    ∑ u = 1 n ∣ x i u − x j u p ∣ p \sqrt[p]{\sum_{u=1}^n|x_{iu} - x_{ju}}|^p pu=1nxiuxju p

  • 无序属性:VDM(Value Difference Metric)
    ∑ i = 1 k ∣ m u , a , i m u , a − m u , b , i m u , b ∣ p \sum_{i=1}^{k}{|\frac{m_{u,a,i}}{m_{u,a}}-\frac{m_{u,b,i}}{m_{u,b}}|^p} i=1kmu,amu,a,imu,bmu,b,ip

K均值算法(k-means):对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。给定样本集D,k-means算法针对聚类所得簇划分C最小化平方误差:
E = ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x − u i ∣ ∣ 2 2 E\ =\ \sum_{i=1}^{k}\sum_{x\in C_i}\left|\left|x-u_i\right|\right|_2^2 E = i=1kxCixui22
K-Means聚类算法步骤实质是EM算法(最大期望算法)的模型优化过程,具体步骤如下:

  1. 随机选择k个样本作为初始簇类的均值向量

  2. 将每个样本数据集划分到离它距离最近的簇

  3. 根据每个样本所属的簇,更新簇类的均值向量

  4. 重复(2)(3)步,当达到最大迭代次数或簇类的均值向量不再改变

代码实现:

数据处理:

import pandas as pd
import numpy as np# https://sci2s.ugr.es/keel/dataset.php?cod=182#inicio
df = pd.read_csv('banana.dat', header=None)def get_data():return np.array(df.iloc[:, :2])

核心代码:

from data_processing import get_data
import numpy as np
import matplotlib.pyplot as plt# 初始化聚类中心
def init_centroids(data: np.array, k: int) -> np.array:return data[np.random.choice(data.shape[0], k, replace=False)]# 欧拉距离
def euclidean_distance(x: np.array, y: np.array) -> float:return np.sqrt(np.sum(np.square(x - y)))# 计算每个样本点到k个聚类中心的距离
def compute_distance(data: np.array, centroids: np.array) -> np.array:distance = np.zeros((data.shape[0], centroids.shape[0]))for i in range(centroids.shape[0]):distance[:, i] = np.apply_along_axis(euclidean_distance, 1, data, centroids[i])return distance# KMeans算法
def kmeans(data: np.array, k: int, max_iter: int = 10):centroids = init_centroids(data, k)for i in range(max_iter):distance = compute_distance(data, centroids)# 每个样本点到k个聚类中心的距离最小值的索引labels = np.argmin(distance, axis=1)for j in range(k):centroids[j] = np.mean(data[labels == j], axis=0)return labels, centroidsif __name__ == '__main__':data = get_data()k = 3centroids = init_centroids(data, k)labels, centroids = kmeans(data, k)# print(labels.shape)plt.title('K-Means Clustering', fontsize=16)plt.xlabel('Feature 1', fontsize=14)plt.ylabel('Feature 2', fontsize=14)plt.scatter(data[:, 0], data[:, 1], c=labels, cmap='viridis')plt.show()

在这里插入图片描述

机器学习之K-Means(k均值)算法_k-means算法-CSDN博客

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

相关文章:

  • 保姆级GitHub大文件(100mb-2gb)上传教程
  • 1.【BUUCTF】[SUCTF 2019]EasyWeb
  • CloudberryDB(七)二级索引
  • P1878 舞蹈课(详解)c++
  • 何须付费免费它不香吗
  • ELK组成及实现原理
  • 【Vue3源码解析】响应式原理
  • servlet中的ServletContext
  • 第1825天 | 我的创作纪念日:缘起、成长经历、大方向
  • 如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题
  • Java 设计模式之迭代器模式
  • 登录演示和功能拆解
  • DeepSeek深度求索API多线程批量写原创文章软件-ai痕迹极低
  • Redis进阶使用
  • Python常见面试题的详解6
  • Linux基础之文件权限的八进制表示法
  • 数据结构与算法面试专题——堆排序
  • 《On Java进阶卷》阅读笔记(五)
  • 《代码随想录》刷题笔记——回溯篇【java实现】
  • 数值积分:通过复合梯形法计算
  • AcWing——3624. 三值字符串
  • 【JavaEE进阶】验证码案例
  • Uniapp 短视频去水印解析工具开发实现
  • 计算机网络-八股-学习摘要
  • 编程速递-庆祝Delphi诞生30周年!
  • 每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
  • 性能测试流程、主流性能工具
  • DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏
  • 无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架
  • 【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版