机器学习: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=1∑n∣xiu−xju ∣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=1∑k∣mu,amu,a,i−mu,bmu,b,i∣p

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=1∑kx∈Ci∑∣∣x−ui∣∣22

K-Means聚类算法步骤实质是EM算法(最大期望算法)的模型优化过程,具体步骤如下:

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

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

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

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

代码实现:

数据处理:

python 复制代码
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])

核心代码:

python 复制代码
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博客

相关推荐
NAGNIP10 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab11 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab11 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP15 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年15 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼15 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS15 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区16 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈17 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang17 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx