K-均值算法

一、算法步骤 

1、随机选取k个初始中心点;

2、针对数据集中的每个样本点,计算样本点与k个中心点的距离,将样本点划分到离它最近的中心点所对应的类别中;

3、类别划分完成后,重新确定类别的中心点,将类别中所有样本各特征的均值作为新的中心点对应特征的取值,即该类中所有样本的质心;

4、重复上面的2、3步骤,直到到达某个终止条件(迭代次数,每一个簇中的点不再变等·)

 二  西瓜书数据集4.0代码

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

def createxcle():
    dataset = pd.read_excel('train.xlsx')
    label=dataset.columns
    return np.array(dataset),label

def Kmean(dataset,k):
    #k 个聚类簇数

    dataArray=dataset[:,:-1]    #二维数组不含判断列
    #初始化k个均值向量
    index =np.random.randint(0,len(dataset),k)  #返回k个随机索引的列表
    mu = dataArray[index]      #创建初始簇
 # [[0.697 0.46 ]
 # [0.473 0.376]
 # [0.282 0.257]
 # [0.639 0.161]
 # [0.751 0.489]]
    m=len(dataset)    #样本数据个数
    #划分簇
    flag=True
    retCluster={}   #设置一个空簇集合
    while flag:
        cluster={}    #Ci=空集
        for i  in range(m):
            minDist=np.inf   #无穷
            minIndex=-1
            for j in range(len(mu)):
                meanDist=np.sqrt(((dataArray[i] - mu[j]) ** 2).sum())  #计算数据与均值向量的距离
                if meanDist<minDist:
                    minDist=meanDist
                    minIndex=j      #最小的样本值 下标索引
            # 把第i个元素划入第j个簇中   用字典的值(它是列表)来保存样本下标索引
            if minIndex not in cluster.keys():
                cluster[minIndex]=[]   #把这个字典中簇的值设置为 空列表[]
            cluster[minIndex].append(i)


        #2.更新均值向量
        updateNums =0    #更新次数统计
        for i in range(k):
            data =np.array(dataArray[cluster[i]])  #data为每个簇中保存的样本x
            print(data,'簇C{}的样本包含{}'.format(i,data))
            #计算新均值向量
            mu2= data.sum(axis=0)/len(data)   #axio案列相加[[0.697 0.46 ] [0.774 0.376] ]
            #检验均值向量是否相同
            vecDist=np.sqrt(((mu[i]-mu2)**2).sum())
            if vecDist!=0:
                mu[i]=mu2
                updateNums=1

        if   updateNums==0:
            flag=False
            retCluster=cluster

    return retCluster,mu

def main():
    dataSet, label = createxcle()
    cluster,mu = Kmean(dataSet,6)
    print(cluster,'每个簇')
    print(mu,'簇均值')
    for key in cluster.keys():
        data=np.array(dataSet[cluster[key]])
        plt.scatter(data[:, 0], data[:, 1],label=key)
    plt.scatter(mu[:, 0], mu[:, 1], s=80, c='r', marker="D")
    plt.xlabel('密度',fontsize=20)
    plt.ylabel('含糖率',fontsize=20)
    plt.legend()
    plt.show()

if __name__ == '__main__':
    main()

三  运行结果

{0: [0, 1, 22, 26, 29],

1: [2, 3, 4], 3: [5, 10, 15, 19, 20],

5: [6, 8, 11, 12, 18],

2: [7, 9, 13, 14, 16, 17, 21],

4: [23, 24, 25, 27, 28, 30]} 每个簇


[[0.7322     0.4232    ]
 [0.59933333 0.26566667]
 [0.66971429 0.13114286]
 [0.3254     0.2744    ]
 [0.4895     0.40416667]
 [0.373      0.1408    ]] 簇均值

 

四  train.xlsx数据

train.xlsx
密度含糖率好瓜/坏瓜
0.6970.461
0.7740.3761
0.6340.2641
0.6080.3181
0.5560.2151
0.4030.2371
0.4810.1491
0.6660.0911
0.4370.2111
0.6660.091-1
0.2430.267-1
0.2450.057-1
0.3430.099-1
0.6390.161-1
0.6570.198-1
0.360.37-1
0.5930.042-1
0.7190.103-1
0.3590.188-1
0.3390.241-1
0.2820.257-1
0.7480.232-1
0.7140.3461
0.4830.3121
0.4780.4371
0.5250.3691
0.7510.4891
0.5320.4721
0.4730.3761
0.7250.4451
0.4460.4591

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值