聚类算法——Kmeans


Kmeans

        K-means算法是聚类分析中使用最广泛的算法之一。它把n个对象根据他们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。其聚类过程可以用下图表示:

在这里插入图片描述
        如图所示,数据样本用圆点表示,每个簇的中心点用叉叉表示。(a)刚开始时是原始数据,杂乱无章,没有label,看起来都一样,都是绿色的。(b)假设数据集可以分为两类,令K=2,随机在坐标上选两个点,作为两个类的中心点。(c-f)演示了聚类的两种迭代。先划分,把每个数据样本划分到最近的中心点那一簇;划分完后,更新每个簇的中心,即把该簇的所有数据点的坐标加起来去平均值。这样不断进行”划分—更新—划分—更新”,直到每个簇的中心不在移动为止。

        该算法过程比较简单,但有些东西我们还是需要关注一下,此处,我想说一下"求点中心的算法"

        一般来说,求点群中心点的算法你可以很简的使用各个点的X/Y坐标的平均值。也可以用另三个求中心点的的公式:

1. Minkowski Distance 公式 —— λ \lambda λ可以随意取值,可以是负数,也可以是正数,或是无穷大。
d i j = λ ∑ k = 1 n ∣ x i k − x j k ∣ λ d_{ij}=\lambda\sqrt{\sum_{k=1}^n\lvert x_{ik}-x_{jk}\rvert^\lambda} dij=λk=1nxikxjkλ
2. Euclidean Distance 公式 —— 也就是第一个公式 λ \lambda λ=2 的情况
d i j = ∑ k = 1 n ( x i k − x j k ) 2 d_{ij}=\sqrt{\sum_{k=1}^n( x_{ik}-x_{jk})^2} dij=k=1n(xikxjk)2
3. CityBlock Distance 公式 —— 也就是第一个公式 λ \lambda λ=1 的情况
d i j = ∑ k = 1 n ∣ x i k − x j k ∣ d_{ij}=\sum_{k=1}^n\lvert x_{ik}-x_{jk}\rvert dij=k=1nxikxjk
        这三个公式的求中心点有一些不一样的地方,我们看下图(对于第一个 λ \lambda λ 在 0-1之间)。
在这里插入图片描述Euclidean Distance在这里插入图片描述

Kmeans与KNN的区别

KmeansKNN
K的含义 K是人工固定好的数字,假设数据集合可以分为K个簇,由于是依靠人工定好,需要一点先验知识来了一个样本x,要给它分类,即求出它的y,就从数据集中,在x附近找离它最近的K个数据点,这K个数据点,类别c占的个数最多,就把x的label设为c
区别1.K-Means是聚类算法
2.非监督学习
3.喂给它的数据集是无label的数据,是杂乱无章的,经过聚类后才变得有点顺序,先无序,后有序
4.有明显的前期训练过程
1.KNN是分类算法
2.监督学习
3.喂给它的数据集是带label的数据,已经是完全正确的数据
4.没有明显的前期训练过程,属于memory-based learning
相似点都包含这样的过程,给定一个点,在数据集中找离它最近的点。即二者都用到了NN(Nearest Neighbor)算法,一般用KD树来实现NN。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kmeans聚类算法是一种无监督学习算法,用于将数据集划分为不同的。它是一个迭代算法,通过计算每个数据点与中心的距离,将数据点分配到最近的中心。然后,根据分配的数据点更新中心。重复这个过程,直到中心不再变化或达到预设的迭代次数。 下面是一个使用Python实现Kmeans聚类算法的示例: ``` python import numpy as np import matplotlib.pyplot as plt # 生成随机数据 np.random.seed(0) X = np.random.randn(100, 2) # 初始化K个中心 K = 3 centers = X[np.random.choice(len(X), K, replace=False)] # 迭代聚类 for i in range(10): # 计算每个数据点最近的中心 distances = np.linalg.norm(X[:, np.newaxis, :] - centers, axis=2) labels = np.argmin(distances, axis=1) # 更新中心 for k in range(K): centers[k] = np.mean(X[labels == k], axis=0) # 可视化聚类结果 colors = ['r', 'g', 'b'] for k in range(K): plt.scatter(X[labels == k, 0], X[labels == k, 1], c=colors[k]) plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, c='#050505') plt.show() ``` 在这个例子中,我们生成了一个随机数据集,然后初始化了3个中心。然后,我们执行10次迭代,计算每个数据点最近的中心,并根据分配的数据点更新中心。最后,我们可视化聚类结果,其中每个用不同的颜色表示,中心用星号表示。 Kmeans聚类算法是一种简单有效的聚类算法,但它有一些缺点。例如,它需要预先指定的数量K,这可能不是很容易确定。此外,它对初始中心的选择很敏感,可能会导致陷入局部最优解。因此,在实际应用中,需要对它进行改进,例如Kmeans++算法和层次聚类算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值