使用Python进行K均值聚类


使用Python进行K均值聚类

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

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

该算法将接受两个输入:

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

b)训练数据集

表示形式:

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

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

使用Python进行K均值聚类

聚类分配步骤:

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

使用Python进行K均值聚类

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

使用Python进行K均值聚类

随机初始化


使用Python进行K均值聚类

在聚类分配步骤之后

移动质心的步骤:

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

使用Python进行K均值聚类

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

K-均值的优化目标:


使用Python进行K均值聚类

这称为distortion函数

局部最优:

使用Python进行K均值聚类

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

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

选择聚类数:

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

使用Python进行K均值聚类

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

使用python实现:

导入Python库

<code>

import

numpy

as

np

import

pandas

as

pd

import

matplotlib.pyplot

as

plt/<code>

导入机器学习数据集

<code>

X

= pd.read_csv(

"data1.csv"

)/<code>

可视化数据集

<code>a = X[

'0'

].values b = X[

'1'

].values X = np.

array

(

list

(zip(a, b))) plt.scatter(a, b , c=

'black'

, s=

7

)/<code>

定义K值并随机初始化点

<code>

K

=

3

c_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)/<code>

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

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

使用Python进行K均值聚类

聚类分配

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

<code>

m

=

X.shape[0]

idx

=

np.zeros(m)

for

i in range(m):

temp

=

np.zeros(K)

for

j in range(K):

=

np.sum((X[i,:] - c[j,:]) ** 2)

=

np.argmin(temp)

/<code>

计算质心

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

<code>

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

)/<code>

进行可视化

<code>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'

)/<code>
使用Python进行K均值聚类


分享到:


相關文章: