机器学习知识总结——18.实现一个简单的K-Means聚类

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

在上一章节里简要的介绍了无监督学习中聚类的知识点看的太多理论概念难免会有点莫名其妙现在就让我们来实现一个简单的 K-Means 算法从而从原理上彻底弄明白聚类是怎么工作的。

引用库

我们还是像其他示例一样尽量用最少的第三方库来阐述清楚问题所以这里我们也只引用Numpy和绘图工具matplotlib

import numpy as np
import matplotlib as plt

生成样本数据

我们需要生成一些样本于是继续用到 np.random.normal 用来生成正态分布数据。

# 生成样本数据
np.random.seed(0)
cluster1 = np.random.normal(3, 1, (100, 2))
cluster2 = np.random.normal(7, 1, (100, 2))
cluster3 = np.random.normal(11, 1, (100, 2))
X = np.concatenate((cluster1, cluster2, cluster3), axis=0)

训练K-Means

基本上我们需要实现的函数主要有三个一个是样本到质心的距离计算函数可以使用简单的欧式距离进行判断

# 计算每个样本到质心的距离
def distance(X, centers):
    dist = np.sqrt(np.sum((X[:, np.newaxis] - centers) ** 2, axis=-1))
    return dist

然后要随时更新质心

# 重新计算质心
def update_centers(X, labels, k):
    centers = np.array([X[labels == i].mean(axis=0) for i in range(k)])
    return centers

然后就是主要的 k-means 主函数了

# k-means 主函数
def kmeans(X, k, max_iter=100):
    centers = initial_centers
    for i in range(max_iter):
        dist = distance(X, centers)
        labels = np.argmin(dist, axis=-1)
        centers = update_centers(X, labels, k)
    return labels, centers

然后我们告诉程序请帮我们把训练数据生成3类

# 实验
labels, centers = kmeans(X, 3)

得到的结果如下

在这里插入图片描述

实验

为了验证我们的模型是否有能力对新的数据进行分类我们使用随机数生成一个测试数据集并实现了一个简单的预测函数

# 现在我们来开始做预测
def predict(X, centers):
    dist = np.sqrt(np.sum((X[:, np.newaxis] - centers) ** 2, axis=-1))
    return np.argmin(dist, axis=-1)

然后看看我们的结果是怎样
在这里插入图片描述

看来成功了一个简单的聚类实现大致上就是上面这些代码所示范的过程希望对你有所帮助。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习