聚类算法实战项目-机械学习

实验目的

(1)了解聚类算法的相关概念及含义; (2)掌握聚类算法求解问题的流程; (3)能够编写出聚类算法(任选一个即可)求解某一问题的代码; (4)能够分析实验结果,对算法进行评估。

实验内容

该实验内容包括以下三部分:

(1)从K-均值聚类、系统聚类、EM聚类等中任选一个均可,并对所选算法的相关概念进行阐述;

(2)任选一个数据集,并阐述自己所选定的数据集。

(3)设计实验方案,进行仿真和预测,建议对聚类结果进行可视化。

实验过程

 一、 聚类算法的相关概念及含义
        聚类是一种无监督学习方法,旨在将数据样本划分为若干组或者簇,使得每个簇内部的数据点相似度高,而不同簇之间的相似度低。聚类算法通常用于数据分析、模式识别、图像处理和计算机视觉等领域。
        聚类算法的核心思想是:将数据点映射到一个欧几里得空间中,根据数据点之间的距离计算它们的相似度,并通过迭代优化的方式确定每个数据点所属的簇。常见的聚类算法包括K-均值聚类、层次聚类、DBSCAN等。
二、聚类算法求解问题的流程
        聚类算法求解问题的流程大致如下:
1.数据准备:收集和处理需要聚类的数据。
2.特征工程:对原始数据进行特征提取和特征选择,以便于聚类算法的训练和预测。通常需要进行缺失值处理、标准化、数据变换和特征选择等操作。
3.定义相似度度量:选择适合问题的相似度度量方法,常用的相似度度量有欧几里得距离、曼哈顿距离、余弦相似度等。
4.簇数确定:对于K-均值聚类算法,需要事先确定簇的数量或者在训练过程中动态调整簇的数量。
5.初始化质心:对于K-均值聚类算法,需要初始化每个簇的质心,通常使用随机选取数据点的方式来进行初始化。
6.求解每个簇的质心:通过不断迭代优化,计算每个簇内部数据点和簇的质心之间的距离,并将每个数据点分配到距离最近的质心所在的簇中。
7.对于每个簇中的数据点进行重新划分,重复执行步骤6
8.确定最优解:根据指标(如轮廓系数)评价聚类效果,并确定最优解。
9.聚类结果输出:输出聚类结果。
三、 实验结果分析与算法评估
        对于聚类算法的评估,通常使用轮廓系数、Calinski-Harabasz指数和Davies-Bouldin指数等指标来评价聚类效果。其中,轮廓系数是一种与“类别”数量无关的指标,可以用于比较不同簇数的聚类算法效果。具体来说,轮廓系数描述了每个样本到自己所在簇的相似程度与到其他簇的相异程度之间的准确度。如果一个聚类算法的轮廓系数越高,则表示聚类效果越好。

实验Python代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
blob_centers=np.array([[0.2,2.3],[-1.5,2.3],[-2.8,1.8],[-2.8,2.8],[-2.8,1.3]])
blob_std=np.array([0.4,0.3,0.1,0.1,0.1])
X,y=make_blobs(n_samples=2000,centers=blob_centers,cluster_std=blob_std,random_state=7)
def plot_clusters(X,y=None):
plt.scatter(X[:,0],X[:,1],c=y,s=1)
plt.xlabel("$X_1$",fontsize=14)
plt.ylabel("$X_2$",fontsize=14,rotation=0)
plt.figure(figsize=(8,4))
plot_clusters(X)
plt.show()

from sklearn.cluster import KMeans
kmeans=KMeans(n_clusters=5,random_state=42)
y_pred=kmeans.fit_predict(X)
print(y_pred)
print(y_pred[:10])
print(kmeans.labels_[:10])
print(kmeans.cluster_centers_)

from sklearn.metrics import silhouette_score
print(silhouette_score(X,kmeans.labels_))

X_new=np.array([[0,2],[3,2],[-3,3],[-3,2.5]])
pred_=kmeans.predict(X_new)
print(pred_)
# transfrom计算每个样本到中心点的距离
print("kmeans.transform(X_new):",kmeans.transform(X_new))
# inertia_
print("inertia_:",kmeans.inertia_)
print("kmeans.score(X):",kmeans.score(X))
# k值的确定
per_k=[KMeans(n_clusters=k).fit(X) for k in range(1,10)]
iners=[model.inertia_ for model in per_k]
plt.figure(figsize=(8,4))
plt.plot(range(1,10),iners,'bo-')
plt.axis([1,9,0,1300])
plt.show()

si_s=[silhouette_score(X,model.labels_) for model in per_k[1:]]
plt.figure(figsize=(8,4))
plt.plot(range(2,10),si_s,'bo-')
plt.show()

疑难小结

        本次实验主要介绍了聚类算法的相关概念和含义,以及K-均值聚类算法的求解流程、编写代码和评估方法等方面内容。其中,我们使用鸢尾花数据集作为示例,演示了如何使用Python和Scikit-learn库进行K-均值聚类算法的实现和求解。通过本次实验,我们可以了解到聚类算法在无监督学习领域中的应用和优势,以及如何对聚类算法进行求解、评估和优化等操作。同时,我们还可以深入理解K-均值聚类算法的原理和特点,并掌握编写代码和分析实验结果的技能。
疑难小解:
1.如何确定最优的簇数?
通常情况下,我们可以通过手动试验或者自动搜索的方式来确定最优的簇数。手动试验的方法是基于经验和直觉,通过观察聚类效果图和比较不同簇数的轮廓系数等指标来确定最佳簇数。自动搜索的方法包括网格搜索和贪心搜索等,可以根据指定参数范围和目标函数自动地搜索最优的簇数。
2.K-均值聚类算法存在的问题是什么?
K-均值聚类算法存在一些问题,例如对初始质心的敏感性、需要人为设定簇数、无法处理不同密度和形状的数据等。此外,K-均值也容易受到噪声和异常点的干扰,可能会影响聚类效果。
3.如何处理K-均值聚类算法中的异常点和噪声?
处理异常点和噪声可以通过多种方法实现,例如使用离群值检测算法来排除异常点、使用基于密度的聚类算法来处理不同密度的数据、使用层次聚类算法来处理不同形状的数据等。在实际应用中,我们需要结合具体问题和数据特征,选择适当的处理方法来提高聚类效果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

真的卷不栋了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值