机器学习实验——K-Means聚类

K-Means聚类

源码与数据:github

一、 实验要求

1、编程实现K-means,对所提供数据(data.txt)进行聚类,cluster数量为3
2、数据形式为[x1, x2],其中x1,x2为样本属性

二、 实验原理:

2.1 K-means原理

K-means是一种基于距离的聚类算法,主要用于将数据点分成k个不同的簇,使得每个簇内的数据点相似度较高,不同簇之间的相似度较低。K-means是一种迭代算法,需要不断地迭代调整簇的中心点,直至满足停止迭代的条件。

2.2 K-means简要算法流程如下:

① 从数据集中随机选择k个数据点作为初始中心点(centroid)。
② 针对每个数据点,计算它与k个中心点的距离,并将它分配到距离最近的中心点所代表的簇中。
③ 针对每个簇,重新计算它的中心点,即将它的所有数据点的平均值作为新的中心点。
④ 重复步骤2和步骤3,直到簇的分配不再发生变化,或者达到预先设定的迭代次数。
⑤ 算法结束,输出最终的簇分配结果和中心点坐标。

2.3 k值

在实际应用中,簇的数量k可以根据领域知识、经验或试错法来确定。

2.4 K-means优缺点

1、优点:
① 算法简单易实现。
② 对于大规模数据集,K-means算法可以通过并行化技术加速计算。
③ 聚类效果较好,且能够适用于各种不同类型的数据。
2、缺点:
① 需要手动设定簇的数量k,这可能需要领域知识或试错法来确定。
② 对于不同的随机初始中心点,可能会得到不同的聚类结果,这会导致算法的不稳定性。
③ 算法可能会收敛到一个局部最优解,而不是全局最优解。

三、 实验过程:

3.1 读取数据

数据保存在“data.txt”中,保存格式如图:

在这里插入图片描述

根据数据的保存格式读取数据。

data_list = []  
with open(path,"r") as f:  
    lines = f.readlines()  
    for line in lines:  
        line = line.strip()  
        tmp = line.strip('[]').split()  
        data_list.append([float(num) for num in tmp])  
data = np.array(data_list)  
print(data.shape)  

“data_list”保存处理后的每行数据,读取完数据后,将其转化为“ndarray”并打印数据的形状。
利用“strip”函数去掉空格和中括号,通过列表生成式生成每行数据,并用“float”进行数字类型转换。
如图所示,数据集形状为90*2,即有90个样本,每个样本有两个属性。

在这里插入图片描述

3.2 分析k值

以散点图形式打印数据集,观察数据集的分布。
在这里插入图片描述

如图所示,数据集大致由两簇组成,因此暂时确定k值为2。

3.3 K-means算法辅助函数

1、计算欧氏距离
通过欧氏距离评估样本和中心点的距离

#计算欧氏距离  
def getDistance(x,y):  
    return np.sqrt(np.sum((x-y)**2))  

2、随机中心点
刚开始聚类时,需要根据k值确定随机中心点以展开聚类。随机中心点的优劣对聚类结果具有重要影响。

#初始化中心点  
def getCenter(dataset,k):  
    m,n = dataset.shape  
    centerDots = np.zeros((k,n))  
    for i in range(k):  
        row = np.random.randint(m)  
        centerDots[i,:] = dataset[row,:]  
    return centerDots  

3.4 K-means算法实现

说明见2.2。
本实验中判断聚类结束的条件为:当前轮次没有点更换过簇。反之,若某个点的簇发生了变化,则继续聚类。
每轮聚类结束后,需要更新各个簇的中心点。本实验中取各类样本的均值作为各类的中心点。
聚类结束后,返回聚类中心和各个样本的类别。

#Kmeans算法
def Kmeans(dataset,k):
    m,n = dataset.shape
    clusters = np.mat(np.zeros((m,2)))#构造m*2存储分类属性
    centerDots = getCenter(dataset, k)#获取随机中心
    
    Continuing = True
    while(Continuing):
        Continuing = False
        for i in range(m):
            minDistance = 1e5
            minindex = -1
            
            for j in range(k):
                #计算当前记录离那个中心更近
                distance = getDistance(centerDots[j,:], dataset[i,:])
                if distance < minDistance:
                    minDistance = distance
                    minindex = j
            #更新i记录类别
            if clusters[i,0] != minindex:
                Continuing = True
                clusters[i,:] = minindex,minDistance
        #更新中心点
        for j in range(k):
            cur_cluster = dataset[np.nonzero(clusters[:,0].A == j)[0]]
            centerDots[j] = np.mean(cur_cluster,axis=0)
    
    print("聚类完成")
    return centerDots,clusters[:,0].ravel().tolist()

3.5 K-means聚类结果评估

使用两种方式进行评估:
① 聚类结果可视化
② 对比分析:使用sklearn库的Kmeans算法对统一数据集进行聚类并可视化

#设置k值
k = 2
plt.figure(dpi=100)
#上述Kmeans实现聚类并可视化
plt.subplot(121)
centroids,labels = Kmeans(data,k)
plt.scatter(data[:,0], data[:,1], c=labels)
plt.title("Kmeans from self")
#绘制中心点
centerDots = centroids
for i in range(len(centerDots)):
    plt.annotate("center", xy=(centerDots[i,0],centerDots[i,1]),arrowprops=dict(facecolor="yellow"))
#使用sklearn库的Kmeans算法进行聚类并可视化
plt.subplot(122)
estimator = KMeans(n_clusters=k).fit(data)
plt.scatter(data[:,0], data[:,1], c=estimator.labels_)
centerDots = estimator.cluster_centers_
for i in range(len(estimator.cluster_centers_)):
    plt.annotate("center", xy=(centerDots[i,0],centerDots[i,1]),arrowprops=dict(facecolor="yellow"))
plt.title("Kmeans from sklearn")
plt.show()

2、结果
① 结果1
在这里插入图片描述
3、分析
对比结果1中展示的两个聚类结果,可以发现,上述代码实现的K-means算法聚类效果与sklearn库中的K-means算法效果基本一致,且二者的聚类结果都比较符合数据集实际分布情况。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: [Python] kmeans文本聚类算法pac降维matplotlib显示聚类图像。 首先,我们需要使用Python中的KMeans算法实现文本聚类KMeans算法是一种常见的无监督学习算法,用于将数据样本划分为K个不同的聚类。在文本聚类中,KMeans算法可以将文本数据集划分为相似主题或类别的聚类。 接下来,我们可以使用Principal Component Analysis (PAC)算法对文本数据进行降维。PAC算法是一种常用的降维方法,可以减少特征数目并保留数据集的主要信息。降维后的数据集可以更好地展示聚类结果。 最后,我们可以使用Python中的Matplotlib库显示聚类图像。Matplotlib是一个强大的可视化库,可以用于生成各种图表和绘图。在聚类分析中,可以使用Matplotlib生成散点图等图像来展示不同聚类及其关系。 总结起来,使用Python中的KMeans算法可以实现文本聚类,通过PAC算法可以对文本数据进行降维,然后使用Matplotlib库可以生成聚类图像以展示聚类结果。 注意:以上回答是基于题目中提供的信息,在回答中假设你拥有必要的Python编程知识。 ### 回答2: K-means是一种常用的聚类算法,用于将一组数据划分为不同的簇。在Python中,我们可以使用sklearn库中的KMeans模块实现该算法。 首先,我们需要对文本进行预处理。可以使用自然语言处理的技术,如分词、去除停用词、词干提取等,将文本转换为数字向量表示。 然后,我们使用KMeans模块对文本进行聚类。首先需要选择聚类的簇的数量,然后调用fit方法进行拟合。可以设置其他参数,如初始聚类中心的选择方式、最大迭代次数等。 聚类完成后,我们可以使用KMeans模块的labels_属性获取每个样本所属的簇的标签。我们可以将文本和对应的标签保存到一个数据结构中,方便后续的可视化。 接下来,我们使用Principal Component Analysis(PCA)降维技术对文本数据进行降维。PCA可以将高维数据映射到低维空间,并保留最重要的特征。在Python中,我们可以使用sklearn库中的PCA模块实现降维。 最后,使用matplotlib库进行可视化,展示聚类的结果。可以将降维后的数据点以不同的颜色或形状表示,每种颜色或形状对应一个聚类簇。可以添加标题、坐标轴标签等,使得图像更加直观。 综上所述,通过使用Python中的KMeans文本聚类算法、PCA降维和matplotlib可视化工具,我们可以将文本数据进行聚类,并通过图像呈现出聚类结果,从而更好地理解数据的结构和特征。 ### 回答3: k-means文本聚类算法是一种无监督学习算法,用于将具有相似语义特征的文本聚类在一起。它可以帮助我们理解和组织大量的文本数据。 首先,我们需要对文本数据进行预处理,包括去除停用词、分词、词干化等。接着,我们可以使用TF-IDF(词频-逆文档频率)对文本进行向量化,将文本转换为数值形式,以便后续的算法处理。 然后,我们可以使用k-means算法对向量化后的文本数据进行聚类k-means算法的核心思想是将数据分成k个簇,使得每个簇内的样本与该簇内其他样本的距离较小,与其他簇的距离较大。聚类过程中,我们选择初始化k个中心点,然后迭代地将每个样本分配到最近的中心点,并更新中心点的位置,直到达到停止条件。 在聚类完成后,我们可以使用Principal Component Analysis(PCA)算法进行降维处理,将高维的聚类结果可视化为二维或三维图像。PCA通过线性变换将原始数据映射到一个新的坐标系中,新坐标系的选择是使得新坐标系的第一主成分具有最大的方差,第二主成分具有次大的方差,以此类推。 最后,我们可以使用Matplotlib库来展示降维后的聚类图像。Matplotlib是一个强大的Python绘图库,可以绘制各种类型的图表,如散点图、柱状图、折线图等。我们可以将降维后的聚类结果在二维或三维坐标系下进行可视化展示,以便更直观地观察聚类效果。 总之,使用python的k-means文本聚类算法配合pac降维和Matplotlib显示聚类图像,可以帮助我们对文本数据进行聚类分析,并提供直观的可视化结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值