使用K均值算法进行聚类分析实战数据集(注释全)

Posted fyzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用K均值算法进行聚类分析实战数据集(注释全)相关的知识,希望对你有一定的参考价值。

介绍

 

kmeans算法又名k均值算法。

算法思想:先从样本集中随机选取 ??k 个样本作为簇中心,并计算所有样本与这 ??k 个“簇中心”的距离,对于每一个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。
实现kmeans算法的三点:
  (1)簇个数 ??k 的选择
  (2)各个样本点到“簇中心”的距离
  (3)根据新划分的簇,更新“簇中心”
 

 

数据集:

技术图片

 

代码:

 

import numpy as np
# vecA,vecB是数组形式
# 欧式距离
def distEclud(vecA,vecB):
    return sum((vecA-vecB)**2)**0.5
import numpy as np
dataset=[
    [73,40,7],
    [60,15,5],
    [61,19,2],
    [34,18,6],
    [67,26,10],
    [91,40,4],
    [101,40,13],
    [81,40,6],
    [88,40,8],
    [122,40,17],
    [102,50,17],
    [87,50,12],
    [116,50,11],
    [110,50,17],
    [164,50,17],
    [40,30,1],
    [76,40,17],
    [118,50,9],
    [160,50,15],
    [96,50,16]
]
# 利用numpy.array函数将其转变为标准矩阵
dataset = np.array(dataset)
print(dataset[0])
# 列数
print(np.shape(dataset)[1])
def kmeans0(dataset,k):
    # 样本的个数
    m = np.shape(dataset)[0] 
    # 保存每个样本的聚类情况,第一列表示该样本属于某一类,第二列是与聚类中心的距离
    clusterAssment = np.mat(np.zeros((m,2))) 
    # 产生随机质心,将列表形式转换为数组形式
    centroids = np.array(randCent(dataset,k))
    # 控制聚类算法迭代停止的标志,当聚类不再改变时,就停止迭代
    clusterChanged = True 
    while clusterChanged:  
        # 先进行本次迭代,如果聚类还是改变,最后把该标志改为True,从而继续下一次迭代
        clusterChanged = False 
        for i in range(m): # 遍历每一个样本
            # 每个样本与每个质心计算距离
            # 采用一趟冒泡排序找出最小的距离,并找出对应的类
            # 计算与质心的距离时,刚开始需要比较,记为无穷大
            mindist = np.inf
            for j in range(k): # 遍历每一类
#                 print(np.array(dataset[i,:]))
#                 print(centroids)
                distj =distEclud(dataset[i,:],centroids[j,:])
                if distj<mindist:
                    mindist = distj
                    minj = j
            # 遍历完k个类,本次样本已聚类
            if clusterAssment[i,0] !=minj:  # 判断本次聚类结果和上一次是否一致
                clusterChanged = True   # 只要有一个聚类结果改变,就重新迭代
            clusterAssment[i,:] = minj,mindist**2  # 类别,与距离
        # 外层循环结束,每一个样本都有了聚类结果
        
        # 更新质心
        for cent in range(k):
            # 找出属于相同一类的样本
            data_cent = dataset[np.nonzero(clusterAssment[:,0].A == cent)[0]]
            centroids[cent,:] = np.mean(data_cent,axis=0)
    return centroids,clusterAssment  

结果1:

技术图片

 

 

 

 

#提取不同类别的数据
n=(clusterAssment.size+1)//2
loan_data0=np.empty(shape=[0,2])
loan_data1=np.empty(shape=[0,2])
loan_data2=np.empty(shape=[0,2])
for i in range(n):
#     print(clusterAssment[i][0])
    if(clusterAssment[i][0]==0.0):
        loan_data0=np.append(loan_data0,[[i,0]],axis = 0)
    if(clusterAssment[i][0]==1.0):
        loan_data1=np.append(loan_data1,[[i,1]],axis = 0)
    if(clusterAssment[i][0]==2.0):
        loan_data2=np.append(loan_data2,[[i,2]],axis = 0)
print("第一类:")       
print(loan_data0)
print("第二类:")  
print(loan_data1)
print("第三类:")
print(loan_data2)

技术图片

 

 

 

作图

import matplotlib.pyplot as plt
X0=[x[0] for x in loan_data0]
Y0=[x[1] for x in loan_data0]
X1=[x[0] for x in loan_data1]
Y1=[x[1] for x in loan_data1]
X2=[x[0] for x in loan_data2]
Y2=[x[1] for x in loan_data2]


plt.scatter(X0, Y0)
plt.scatter(X1, Y1)
plt.scatter(X2, Y2)
plt.show()

 

结果3:

技术图片

 

 

 图说明:

技术图片技术图片

 

 

 

 

 

 

以上是关于使用K均值算法进行聚类分析实战数据集(注释全)的主要内容,如果未能解决你的问题,请参考以下文章

机器学习实战--k-均值聚类

机器学习经典分类算法 —— k-均值算法(附python实现代码及数据集)

「聚类分析」16聚类分析之KMeans算法与K中心点算法

无监督学习——聚类算法

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

数字数据集上的K-均值聚类