K均值聚类算法(K-Means)

K均值聚类算法(K-Means)

. 实验目标

使用Sklearn库操作机器学习

2. 实验主要使用的 𝑃𝑦𝑡ℎ𝑜𝑛Python 库

名称版本简介
Numpy1.16.0线性代数
Pandas0.25.0数据分析
Matplotlib3.1.0数据可视化
SKlearn0.22.1机器学习

​ 理论学习部分

机器学习(Machine Learning, ML)是人工智能(AI)的一个子集,是使计算机具有智能的根本途径。

在本实验中,您将学习K-Means聚类算法的基本思想、算法以及如何用Python实现。

实验步骤

步骤1 安装并引入必要的库

代码示例:

pip install numpy==1.16.0
pip install pandas==0.25.0
pip install scikit-learn==0.22.1
pip install matplotlib==3.1.0

代码示例:

import random 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.cluster import KMeans 
from sklearn.datasets.samples_generator import make_blobs 
from mpl_toolkits.mplot3d import Axes3D 
from sklearn.datasets import load_iris 
%matplotlib inline

步骤2 生成随机数

创建数据集!

首先,我们需要建立一个随机种子。 使用numpy的random.seed()函数,其中种子将被设置为0

代码示例:

np.random.seed(0)

接下来,我们将使用make_blobs类进行*随机点集群*。make_blobs类接受很多输入,但我们将使用这些特定的输入:**

输入

n_samples: 生成随机点总数取值为: 5000centers:生成样本点的中心取值为: [[4, 4], [-2, -1], [2, -3],[1,1]]cluster_std:类的标准差取值为: 0.9
输出**X
: 形状为 [n_samples, n_features]的数组。 (特征矩阵(Feature Matrix))生成的样本.y: 形状为[n_samples]的数组. (响应向量(Response Vector))样本对应的类别标签**

代码示例:

X, y = make_blobs(n_samples=5000, centers=[[4,4], [-2, -1], [2, -3], [1, 1]], cluster_std=0.9)

显示随机生成的数据的散点图。

代码示例:

plt.scatter(X[:, 0], X[:, 1], marker='.')

在这里插入图片描述

步骤3 设置K-Means

现在我们有了我们的随机数据,让我们设置我们的 K-Means聚类。

KMeans类有许多可以使用的参数,但我们将使用这三个参数:

  • init: 类中心的初始化方法。

    • 取值为: “k-means++”
    • k-means++: 以智能方式为k均值聚类选择初始聚类中心,以加速收敛。
  • n_clusters: 要形成的聚类数量也是要生成的聚类中心数量。

    • 取值为: 4
  • n_init: 设置选择质心种子次数。返回聚类中心最好的一次结果(好是指计算时长短)

    • 取值为: 12

使用这些参数初始化KMeans,其中输出参数称为k_means。

代码示例:

k_means = KMeans(init = "k-means++", n_clusters = 4, n_init = 12)

现在让我们用我们上面创建的特征矩阵X来拟合KMeans模型

代码示例:

k_means.fit(X)

现在让我们使用KMeans的 .labels_ 属性为模型中的每个点获取标签,并将其保存为 k_means_labels

代码示例:

k_means_labels = k_means.labels_
k_means_labels

我们还将使用KMeans的.cluster_centers_ 取聚类中心的坐标,并将其保存为k_means_cluster_centers

代码示例:

k_means_cluster_centers = k_means.cluster_centers_
k_means_cluster_centers

步骤4 绘图

所以现在我们已经生成了随机数据并且初始化了KMeans模型,让我们对它们进行绘制并看看它是什么样的!

请仔细阅读代码和注释以了解如何绘制模型。

代码示例:

# 指定图形尺寸
fig = plt.figure(figsize=(6, 4))

#颜色使用一个颜色映射,它将根据标签的数量生成一个颜色数组。 我们使用set(k_means_labels)来获取唯一的标签。
colors = plt.cm.Spectral(np.linspace(0, 1, len(set(k_means_labels))))

#创建一个黑色背景(背景为黑色,这样有助于我们看到各类中的样本点与聚类中心的连接)
ax = fig.add_subplot(1, 1, 1, facecolor = 'black')

# 用于绘制数据点和聚类中心的循环。
#k将在0-3范围内,这将匹配每个数据点所在的可能簇。

for k, col in zip(range(len([[2, 2], [-2, -1], [4, -3], [1, 1]])), colors):

    # 创建所有数据点的列表,其中类中的数据点标记为true,否则标记为false。
    my_members = (k_means_labels == k)

    # 定义聚类中心
    cluster_center = k_means_cluster_centers[k]

    # 使用color col绘制数据点.
    ax.plot(X[my_members, 0], X[my_members, 1], 'w',
            markerfacecolor=col, marker='.')

    # 指定颜色绘制聚类中心
    ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
            markeredgecolor='k', markersize=6)

# 图名称
ax.set_title('KMeans')

# 删除x轴刻度
ax.set_xticks(())

# 删除y轴刻度
ax.set_yticks(())

# 展示图
plt.show()

# 显示上面的散点图进行比较。
plt.scatter(X[:, 0], X[:, 1], marker='.')

在这里插入图片描述

在这里插入图片描述

步骤5 聚类分析

对iris数据集进行聚类分析

使用 load_iris() 函数, 将iris数据集储存在变量iris

代码示例:

iris = load_iris()

同时将iris.data赋值给X变量,将iris.target赋值给y变量

代码示例:

X = iris.data
y = iris.targe

现在让我们运行其余的代码,看看K-Means产生的结果!

代码示例:

estimators = {'k_means_iris_3': KMeans(n_clusters=3),
              'k_means_iris_8': KMeans(n_clusters=8),
              'k_means_iris_bad_init': KMeans(n_clusters=3, n_init=1,
                                              init='random')}

fignum = 1
for name, est in estimators.items():
    fig = plt.figure(fignum, figsize=(4, 3))
    plt.clf()
    ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)

    plt.cla()
    est.fit(X)
    labels = est.labels_

    ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=labels.astype(np.float))

    ax.w_xaxis.set_ticklabels([])
    ax.w_yaxis.set_ticklabels([])
    ax.w_zaxis.set_ticklabels([])
    ax.set_xlabel('Petal width')
    ax.set_ylabel('Sepal length')
    ax.set_zlabel('Petal length')
    fignum = fignum + 1

# 绘制结果
fig = plt.figure(fignum, figsize=(4, 3))
plt.clf()
ax = Axes3D(fig, rect=[0, 0, .95, 1], elev=48, azim=134)

plt.cla()

for name, label in [('Setosa', 0),
                    ('Versicolour', 1),
                    ('Virginica', 2)]:
    ax.text3D(X[y == label, 3].mean(),
              X[y == label, 0].mean() + 1.5,
              X[y == label, 2].mean(), name,
              horizontalalignment='center',
              bbox=dict(alpha=.5, edgecolor='w', facecolor='w'))
#重新排序标签以使颜色与聚类结果匹配
y = np.choose(y, [1, 2, 0]).astype(np.float)
ax.scatter(X[:, 3], X[:, 0], X[:, 2], c=y)

ax.w_xaxis.set_ticklabels([])
ax.w_yaxis.set_ticklabels([])
ax.w_zaxis.set_ticklabels([])
ax.set_xlabel('Petal width')
ax.set_ylabel('Sepal length')
ax.set_zlabel('Petal length')
plt.show()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 11
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: K-Means 聚类算法是一种常用的无监督学习算法,它可以将数据集划分为 K 个不同的类别,其中 K 是预先设定的。在 K-Means 算法中,我们需要指定 K 值和距离计算方法,然后通过迭代的方式不断调整聚类中心,直到达到某个停止准则为止。 下面我们以鸢尾花数据集为例,来实现 K-Means 聚类算法。 首先,我们需要导入数据集并进行预处理。这里我们使用 sklearn 中的 load_iris 函数来加载数据集,并使用 MinMaxScaler 对数据进行归一化处理: ``` python from sklearn.datasets import load_iris from sklearn.preprocessing import MinMaxScaler # 加载数据集 iris = load_iris() X = iris.data # 数据归一化 scaler = MinMaxScaler() X = scaler.fit_transform(X) ``` 接下来,我们需要实现 K-Means 算法。这里我们使用 scikit-learn 中的 KMeans 类来实现: ``` python from sklearn.cluster import KMeans # 设置 K 值 k = 3 # 初始化 KMeans 模型 kmeans = KMeans(n_clusters=k) # 训练模型并预测结果 y_pred = kmeans.fit_predict(X) ``` 最后,我们可以使用 Matplotlib 来可视化聚类结果: ``` python import matplotlib.pyplot as plt # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=y_pred) plt.title("K-Means Clustering") plt.show() ``` 运行以上代码,即可得到鸢尾花数据的聚类结果。 ### 回答2: K-Means聚类算法是一种常用的无监督学习方法,能够对数据进行聚类。在K-Means算法中,通过计算数据点与聚类中心的距离,将数据点归类到距离最近的聚类中心,从而实现数据的聚类。 鸢尾花数据是机器学习中常用的数据集之一,包含了150个样本,每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。这些样本被分为三个类别,分别是山鸢尾、变色鸢尾和维吉尼亚鸢尾。 使用K-Means聚类算法对鸢尾花数据进行聚类的过程如下: 1. 随机选择K个初始聚类中心。K代表要将数据聚成的类别数,这里我们选择K=3,即将鸢尾花数据聚成3个类别。 2. 对每个数据点,计算其与各个聚类中心的距离,并将其归类到距离最近的聚类中心。 3. 更新每个聚类中心的位置,将其移动到所归类数据点的平均位置。 4. 重复步骤2和3,直到聚类中心不再发生变化或达到预定的迭代次数。 通过上述步骤,可以将鸢尾花数据聚类成3个类别。每个类别中的数据点具有相似的特征,并且与其他类别中的数据点的特征有较大的区别。 K-Means聚类算法的优点是简单易实现,计算效率高。然而,这种算法对初始聚类中心的选择较为敏感,可能会收敛到局部最优解。因此,在应用K-Means算法时,需要进行多次实验,以避免得到不理想的聚类结果。同时,K-Means算法对于离群点比较敏感,离群点可能会影响聚类结果的准确性。 ### 回答3: K-Means 聚类算法是一种常用的无监督学习算法,主要用于将数据集中的样本划分成不同的簇。下面以实现鸢尾花数据的聚类为例进行解释。 首先,我们需要加载鸢尾花数据集,该数据集包含了150个样本,每个样本有4个特征,分别是花萼长度、花萼宽度、花瓣长度和花瓣宽度。我们将这些样本表示为一个150x4的矩阵。 然后,我们需要确定簇的数量 k,即要将数据集划分成几个簇。在这里,我们可以根据经验或者领域知识来选择一个合适的值。 接下来,我们需要初始化 k 个簇的中心点。可以随机从数据集中选取 k 个样本作为初始的簇中心点。 然后,对于每个样本,我们计算其与各个簇中心点的距离,并将其分配给距离最近的簇中心点所在的簇。 接着,我们更新每个簇的中心点,即将每个簇中的样本的特征均值作为新的簇中心点。 最后,我们重复执行以上两个步骤,直到簇中心点不再发生变化,或者到达预定的迭代次数。 完成聚类后,我们可以根据簇的中心点和每个样本所属的簇来进行结果的分析和可视化。例如,可以绘制不同簇中心点的特征值分布图,以及将样本点按簇的标签进行颜色分类的散点图等。 K-Means 聚类算法能够有效地将数据集划分为不同的簇,实现了对样本的聚类。在鸢尾花数据集这个例子中,我们可以根据花萼和花瓣的特征值将鸢尾花分为不同的类别,从而更好地了解这些花的分类情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无心 码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值