机器学习:k均值

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

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

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

距离计算:

  • 连续属性及离散有序属性:闵可夫斯基距离:
    ∑ u = 1 n ∣ x i u − x j u p ∣ p \sqrtp{\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博客

相关推荐
yh弓长4 分钟前
Agent 的工作流与模式
人工智能
tellmewhoisi10 分钟前
深度学习31番外篇:离散卷积
人工智能·深度学习
Keep_Trying_Go44 分钟前
Consistent-Point半监督人群计数算法详解
人工智能·深度学习·算法·计算机视觉·人群计数
老纪的技术唠嗑局1 小时前
PowerContext 1.4.0 发布:开发做到一半,换个 Agent 怎么继续?
人工智能
在所不辞兄1 小时前
【零基础学智能仿真-69】综合项目——材料参数驱动的仿真研究
人工智能·深度学习·神经网络·算法·机器学习·1024程序员节
天天代码码天天1 小时前
喊一声“小芽小芽”,让电脑陪孩子聊聊天:我的 C# 儿童语音伙伴升级了
人工智能
老纪的技术唠嗑局1 小时前
我们想和你一起,让 Agent 的优化有据可循
人工智能
桑年1 小时前
四、Pandas数据处理
人工智能·python·线性代数·pandas·数据可视化·数据处理
大雾的小屋1 小时前
卷积神经网络原理解析:从1989年手写邮编识别到现代计算机视觉
人工智能·计算机视觉·cnn
Luchang-Li2 小时前
DeepSeek v4.1 Flash SGLang引擎KV cache存储逻辑
人工智能