自学内容网 自学内容网

K-Means聚类简介及示例

K-Means聚类是一种无监督机器学习算法,它将未标记的数据集分组到不同的聚类中。

K-Means聚类

无监督机器学习是教计算机使用未标记、未分类数据,并使算法能够在没有监督的情况下对这些数据进行操作的过程。在没有任何先前的数据训练的情况下,机器在这种情况下的工作是根据平行、模式和变化来组织未排序的数据。

聚类的目标是将总体或数据点集划分为多个组,以便每个组中的数据点彼此之间更具可比性,并且与其他组中的数据点不同。它本质上是一个基于事物之间相似和不同程度的分组。

我们得到了一个数据集的项目,具有某些特征,以及这些特征的值(如向量)。任务是将这些项目分类到组中。为了实现这一点,我们将使用K-means算法,一种无监督学习算法。算法名称中的“K”表示我们希望将项目分类到的组/聚类的数量。

该算法将项目分类为k组或相似性聚类。为了计算相似度,我们将使用欧几里得距离作为度量。

该算法的工作原理如下:

  1. 首先,我们随机初始化k个点,称为均值或聚类质心。
  2. 我们将每个项目分类为其最接近的平均值,并更新平均值的坐标,这是迄今为止该集群中分类的项目的平均值。
  3. 我们对给定的迭代次数重复这个过程,最后,我们得到了聚类。

上面提到的“点”被称为平均值,因为它们是其中分类的项目的平均值。要初始化这些方法,我们有很多选择。一个直观的方法是在数据集中的随机项处初始化均值。另一种方法是将均值初始化为数据集边界之间的随机值(如果对于一个特征x,项目的值在[0,3]中,我们将用x的值在[0,3]中初始化均值)。

上述伪代码中的算法如下:


随机初始化k值
-->对于给定的迭代次数:
    
    -->遍历项目:
    
        -->通过计算找到最接近项目的平均值 
        项与每个均值的欧氏距离
        
        -->将项目分配给平均值
        
        -->通过将其移动到该集群中项目的平均值来更新平均值

示例1:

导入必要的库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

使用make_blobs创建自定义数据集并绘制它

X,y = make_blobs(n_samples = 500,n_features = 2,centers = 3,random_state = 23)

fig = plt.figure(0)
plt.grid(True)
plt.scatter(X[:,0],X[:,1])
plt.show()

在这里插入图片描述
初始化随机质心

k = 3

clusters = {}
np.random.seed(23)

for idx in range(k):
center = 2*(2*np.random.random((X.shape[1],))-1)
points = []
cluster = {
'center' : center,
'points' : []
}

clusters[idx] = cluster

clusters

输出

{0: {'center': array([0.06919154, 1.78785042]), 'points': []},
 1: {'center': array([ 1.06183904, -0.87041662]), 'points': []},
 2: {'center': array([-1.11581855,  0.74488834]), 'points': []}}

用数据点绘制随机初始化中心

plt.scatter(X[:,0],X[:,1])
plt.grid(True)
for i in clusters:
center = clusters[i]['center']
plt.scatter(center[0],center[1],marker = '*',c = 'red')
plt.show()

在这里插入图片描述
定义欧氏距离

def distance(p1,p2):
return np.sqrt(np.sum((p1-p2)**2))

创建分配和更新集群中心的函数

#Implementing E step 
def assign_clusters(X, clusters):
for idx in range(X.shape[0]):
dist = []

curr_x = X[idx]

for i in range(k):
dis = distance(curr_x,clusters[i]['center'])
dist.append(dis)
curr_cluster = np.argmin(dist)
clusters[curr_cluster]['points'].append(curr_x)
return clusters

#Implementing the M-Step
def update_clusters(X, clusters):
for i in range(k):
points = np.array(clusters[i]['points'])
if points.shape[0] > 0:
new_center = points.mean(axis =0)
clusters[i]['center'] = new_center

clusters[i]['points'] = []
return clusters

创建函数以预测数据点的聚类

def pred_cluster(X, clusters):
pred = []
for i in range(X.shape[0]):
dist = []
for j in range(k):
dist.append(distance(X[i],clusters[j]['center']))
pred.append(np.argmin(dist))
return pred

分配、更新和预测集群中心

clusters = assign_clusters(X,clusters)
clusters = update_clusters(X,clusters)
pred = pred_cluster(X,clusters)

用预测的聚类中心绘制数据点

plt.scatter(X[:,0],X[:,1],c = pred)
for i in clusters:
center = clusters[i]['center']
plt.scatter(center[0],center[1],marker = '^',c = 'red')
plt.show()

在这里插入图片描述

示例2:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans

加载数据集

X, y = load_iris(return_X_y=True)

找到将数据划分成的理想组数是任何无监督算法的基本阶段。计算k的理想值最常用的方法之一是肘部方法。

#Find optimum number of cluster
sse = [] #SUM OF SQUARED ERROR
for k in range(1,11):
km = KMeans(n_clusters=k, random_state=2)
km.fit(X)
sse.append(km.inertia_)

绘制肘图以找到最佳聚类数

sns.set_style("whitegrid")
g=sns.lineplot(x=range(1,11), y=sse)

g.set(xlabel ="Number of cluster (k)", 
ylabel = "Sum Squared Error", 
title ='Elbow Method')

plt.show()

在这里插入图片描述
从上图中,我们可以观察到在k=2和k=3时的肘状情况。因此,我们考虑K=3

构建Kmeans聚类模型

kmeans = KMeans(n_clusters = 3, random_state = 2)
kmeans.fit(X)

找到集群中心

kmeans.cluster_centers_

输出

array([[5.006     , 3.428     , 1.462     , 0.246     ],
       [5.9016129 , 2.7483871 , 4.39354839, 1.43387097],
       [6.85      , 3.07368421, 5.74210526, 2.07105263]])

预测集群组:

pred = kmeans.fit_predict(X)
pred

输出

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2,
       2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 2, 2, 2,
       2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 1], dtype=int32)

用数据点绘制聚类中心

plt.figure(figsize=(12,5))
plt.subplot(1,2,1)
plt.scatter(X[:,0],X[:,1],c = pred, cmap=cm.Accent)
plt.grid(True)
for center in kmeans.cluster_centers_:
center = center[:2]
plt.scatter(center[0],center[1],marker = '^',c = 'red')
plt.xlabel("petal length (cm)")
plt.ylabel("petal width (cm)")

plt.subplot(1,2,2) 
plt.scatter(X[:,2],X[:,3],c = pred, cmap=cm.Accent)
plt.grid(True)
for center in kmeans.cluster_centers_:
center = center[2:4]
plt.scatter(center[0],center[1],marker = '^',c = 'red')
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.show()

在这里插入图片描述


原文地址:https://blog.csdn.net/qq_42034590/article/details/134166906

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!