k均值聚类算法优缺点_使用Python进行K均值聚类

c2c380e927e096f81daba44533b14ec4.png

在机器学习中,当我们要处理一个未标记的数据集时,称为“无监督学习”。有时我们只是想知道我们的数据是如何组织起来的这样我们就能知道数据是如何组织起来的。聚类意味着对一组对象进行分组。

K-means聚类是无监督学习的一部分,我们使用的是未标记的数据集,这个算法会自动为我们将数据分组成聚类。它是目前最流行、应用最广泛的聚类算法之一。它用于各种应用程序,例如市场细分,图像细分等。

该算法将接受两个输入:

a)K(它是您想要的群聚类数)

b)训练数据集

表示形式:

  • K =聚类数
  • C称为聚类质心
  • m =训练示例数
  • idx C(i)=已将实例X(i)分配给聚类的聚类质心

看一个示例,使您可以清楚地看到此符号

da2b0783ec6f6f930571446fbdb8aaa4.png

聚类分配步骤:

在此步骤中,我们将根据数据集中最接近的聚类质心向数据集中分配一个聚类质心,并为分配的数据集上色。这是通过计算欧式距离来实现的。

48dd2e5bacf26ffae8de32b0909f00e3.png

经过随机定义的聚类质心和聚类分配步骤后,将如下图所示:

9cf4080863c4609c08e3174d5be30f83.png

随机初始化

c8c1e54eab6afce084eba8b8fbaeb24e.png

在聚类分配步骤之后

移动质心的步骤:

我们要做的是获取两个聚类质心,即红x和蓝x,然后将它们移动到相同颜色点的平均值。因此,我们要做的是查看所有红色点并计算平均值,实际上,平均值是所有红色点的位置,然后将红色聚类质心移到那里。蓝色x也是如此。

12e31089c148a65c6bb1bebb047b8920.png

计算出运动质心后,我们可以从上图看到质心的位置发生了变化

K-均值的优化目标:

4dbe2680422984b277afd719827e25de.png

这称为distortion函数

局部最优:

3daf48b69d378626c9d430798ec5dedb.png

不幸的是,通过随机初始化K-means算法也可能被卡在不同的局部最优值上,在左边的图中,蓝色的聚类捕获了大量的点,而红色、绿色的聚类则对相对拥有较少的点。

为了得到如图所示的最佳全局最优解,我们可以多次尝试对聚类质心进行随机初始化,并多次运行K-means算法,从而得到尽可能好的局部最优解或全局最优解。

选择聚类数:

我们通常知道K的值,否则我们用肘部法。

0e01b1206ceb28d13d1c3dde9e517530.png

我们针对不同的K值(例如K = 10到1)运行算法,并绘制K值与distortion的关系。如图所示,选择elbow点的K值。

使用python实现:

导入Python库

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt

导入机器学习数据集

X = pd.read_csv("data1.csv")

可视化数据集

a = X['0'].valuesb = X['1'].valuesX = np.array(list(zip(a, b)))plt.scatter(a, b , c='black', s=7)

定义K值并随机初始化点

K = 3c_x = np.random.randint(0 , np.max(X) , size = K)c_y = np.random.randint(0 , np.max(X) , size = K)c = np.array(list(zip(c_x,c_y)),dtype = np.float32)

我们的聚类质心在这些点上,它们是随机选择的

[[6. 1.][4. 5.][5. 4.]]

bc9b2435d151f709b2f9ca1973c8284d.png

聚类分配

将每个输入值分配给最近的中心

m = X.shape[0]idx = np.zeros(m)for i in range(m):    temp = np.zeros(K)    for j in range(K):        temp[j] = np.sum((X[i,:] - c[j,:]) ** 2)         idx[i] = np.argmin(temp)

计算质心

我们通过获取分配给该聚类的所有点的平均值来找到新质心。

for i in range(K):    points = [X[j] for j in range(len(X)) if idx[j] == i]    c[i] = np.mean(points, axis=0)

进行可视化

colors = ['r', 'g', 'b']fig, ax = plt.subplots()for i in range(K):     points = np.array([X[j] for j in range(len(X)) if idx[j] == i])        ax.scatter(points[:, 0], points[:, 1], c=colors[i])ax.scatter(c[:, 0], c[:, 1], marker='*', s=200, c='#050505')
2a36cd469e8aee6508997d24e93b552a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值