k-means聚类算法的原理

k-means聚类算法的原理

K-means是一种聚类算法,其原理是将数据集划分为k个簇,使得每个数据点都属于最近的簇,并且簇的中心是所有数据点的平均值。这个算法是基于迭代优化的,每个迭代步骤会更新簇的中心点,直到达到收敛条件。

下面是K-means聚类算法的基本原理:

初始化:首先,选择要将数据集分成k个簇,然后随机选择k个数据点作为初始簇中心。

分配:将每个数据点分配到距离其最近的簇中心,每个数据点只能属于一个簇。

更新:根据分配的数据点更新簇中心点,这是通过计算属于每个簇的数据点的平均值来实现的。

重复:重复步骤2和3,直到簇中心点不再发生变化,或者达到预定的迭代次数。

输出:得到k个簇和每个簇的中心点。

K-means聚类算法的优缺点:

优点:

K-means算法易于实现和理解,计算效率高,适用于大规模数据集。
适用于处理高维数据,效果较好。
缺点:

需要手动指定簇的个数k,且该值的选择会影响到最终聚类效果。
对于非凸的簇结构,K-means算法的表现不佳,容易陷入局部最优解。
初始的簇中心点的随机选择可能导致不同的聚类结果。

uci数据集网站上适合kmeans聚类算法分析的数据集

  • Iris数据集:这个数据集包含3个不同品种的鸢尾花的测量数据。每个样本有4个属性(花萼长度、花萼宽度、花瓣长度和花瓣宽度)。

  • Wine数据集:这个数据集包含三个不同来源的葡萄酒的测量数据。每个样本有13个属性,包括酸度、酒精含量等。

  • Seeds数据集:这个数据集包含三种小麦种子的测量数据。每个样本有7个属性,包括面积、周长等。

  • Wholesale customers数据集:这个数据集包含批发客户的购买数据。每个样本有8个属性,包括生鲜、牛奶、杂货等。

  • Abalone数据集:这个数据集包含贝类的测量数据。每个样本有8个属性,包括性别、直径、高度等。

  • Diabetes数据集:这个数据集包含糖尿病患者的测量数据。每个样本有8个属性,包括血糖、BMI等。

  • Heart Disease数据集:这个数据集包含心脏病患者的医学数据,每个样本有14个属性,包括年龄、性别、血压等。

  • Credit Card数据集:这个数据集包含信用卡客户的购买数据,每个样本有17个属性,包括客户年龄、性别、账单金额等。

  • Breast Cancer数据集:这个数据集包含乳腺癌患者的医学数据,每个样本有30个属性,包括肿块大小、形状、质地等。

  • Fashion-MNIST数据集:这个数据集包含10种不同类型的时尚服装图像数据,每个样本是一张28*28像素的灰度图像,共70000个样本。

以 Iris数据集这个简单的数据集为例做一个k-means聚类分析的完整代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 定义K-means算法函数
def kmeans(X, k, max_iter):
    # 随机选择k个数据点作为聚类中心
    centroids = X[np.random.choice(len(X), k, replace=False), :]
    # 初始化簇类别
    labels = np.zeros(len(X))
    # 迭代K-means算法
    for _ in range(max_iter):
        # 计算每个样本到每个聚类中心的距离
        distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
        # 更新样本所属的簇类别
        new_labels = np.argmin(distances, axis=0)
        # 判断簇类别是否改变
        if (new_labels == labels).all():
            break
        else:
            labels = new_labels
        # 更新聚类中心
        for i in range(k):
            centroids[i] = X[labels == i].mean(axis=0)
    return centroids, labels

# 读取数据集
iris = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
# 设置数据集的列名
iris.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']

# 获取特征数据
X = iris.iloc[:, :-1].values

# 设置K值和最大迭代次数
k = 3
max_iter = 100

# 调用K-means算法函数
centroids, labels = kmeans(X, k, max_iter)

# 绘制聚类结果
colors = ['r', 'g', 'b']
for i in range(len(X)):
    plt.scatter(X[i][0], X[i][1], c=colors[labels[i]], s=50)
plt.scatter(kmeans.centroids[:, 0], kmeans.centroids[:, 1], c='k', marker='x', s=100)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()

代码2

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 读取数据集
iris = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
# 设置数据集的列名
iris.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class']

# 获取特征数据
X = iris.iloc[:, :-1].values

# 定义K-means算法
class KMeans:
    def __init__(self, n_clusters=3, max_iter=300):
        self.k = n_clusters  # 聚类数量
        self.max_iter = max_iter  # 最大迭代次数

    def fit(self, X):
        # 初始化聚类中心点
        self.centroids = X[np.random.choice(X.shape[0], self.k, replace=False)]
        # 迭代聚类直到收敛或达到最大迭代次数
        for i in range(self.max_iter):
            # 计算每个样本到聚类中心点的距离
            distances = np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2))
            # 分配样本到最近的聚类中心点
            self.labels = np.argmin(distances, axis=0)
            # 更新聚类中心点
            for j in range(self.k):
                self.centroids[j] = np.mean(X[self.labels == j], axis=0)

    def predict(self, X):
        # 预测新样本所属的聚类
        distances = np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2))
        return np.argmin(distances, axis=0)

# 初始化K-means聚类器
kmeans = KMeans(n_clusters=3)

# 训练模型
kmeans.fit(X)

# 预测类别
labels = kmeans.predict(X)

# 绘制聚类结果
colors = ['r', 'g', 'b']
for i in range(len(X)):
    plt.scatter(X[i][0], X[i][1], c=colors[labels[i]], s=
  • 7
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值