当前位置: 首页 > 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, centroids


if __name__ == '__main__':
	data = get_data()
	k = 3
	centroids = 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.dtcms.com/a/20022.html

相关文章:

  • x-restormer——restormer+SSA
  • 【算法】【区间和】acwing算法基础 802. 区间和 【有点复杂,但思路简单】
  • 本地部署MindSearch(开源 AI 搜索引擎框架),然后上传到 hugging face的Spaces——L2G6
  • E卷-特殊的加密算法-(200分)
  • SIP中常见的服务器类型
  • vue项目 Axios创建拦截器
  • Win11 远程 连接 Ubuntu20.04(局域网)
  • lvs的DR模式
  • 易支付精美设计的支付收银台模板源码
  • typecho快速发布文章
  • Oracle序列(基础操作)
  • Spring Bean的生命周期
  • wordpress主题插件开发中高频使用的38个函数
  • 了解rtc_time64_to_tm()和rtc_tm_to_time64()
  • WEB安全--SQL注入--二次注入
  • TCP/UDP 简介,三次握手与四次挥手
  • 使用瑞芯微RK3588的NPU进行模型转换和推理
  • Python使用OpenCV图片去水印多种方案实现
  • Redis问题排查常用命令
  • C#多线程异步连接MySQL与SQLserver数据库
  • E卷-MELON的难题-(200分)
  • 功能说明并准备静态结构
  • 硕成C语言22【一些算法和数组的概念】
  • 【C++】哈希、unordered_map与unordered_set的模拟实现
  • AcWing——3624. 三值字符串
  • windows配置永久路由
  • VMware vSphere数据中心虚拟化——vCenter Server7.0安装部署
  • 【ARM】解决ArmDS Fast Models 中部分内核无法上电的问题
  • 深入理解 Qt 信号与槽机制:原理、用法与优势
  • Spring Boot 携手 DeepSeek:开启智能交互新时代