机器学习: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博客

相关推荐
lilye6611 分钟前
精益数据分析(20/126):解析经典数据分析框架,助力创业增长
大数据·人工智能·数据分析
盈达科技31 分钟前
盈达科技:登顶GEO优化全球制高点,以AICC定义AI时代内容智能优化新标杆
大数据·人工智能
安冬的码畜日常37 分钟前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
古希腊掌管学习的神38 分钟前
[LangGraph教程]LangGraph04——支持人机协作的聊天机器人
人工智能·语言模型·chatgpt·机器人·agent
FIT2CLOUD飞致云1 小时前
问答页面支持拖拽和复制粘贴文件,MaxKB企业级AI助手v1.10.6 LTS版本发布
人工智能·开源
起个破名想半天了1 小时前
计算机视觉cv入门之答题卡自动批阅
人工智能·opencv·计算机视觉
早睡早起吧1 小时前
目标检测篇---Fast R-CNN
人工智能·目标检测·计算机视觉·cnn
小墙程序员1 小时前
机器学习入门(二)线性回归
机器学习
爱喝奶茶的企鹅1 小时前
Ethan独立开发产品日报 | 2025-04-24
人工智能·程序员·开源
鸿蒙布道师1 小时前
OpenAI为何觊觎Chrome?AI时代浏览器争夺战背后的深层逻辑
前端·人工智能·chrome·深度学习·opencv·自然语言处理·chatgpt