K-均值聚类算法

K-均值聚类算法简介

K-均值聚类算法常采用误差平方和函数作为聚类准则函数,即代价函数。K-均值聚类算法,是典型的基于原型的目标函数聚类算法的代表,以数据点到原型的某种发距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。

算法原理

K-均值聚类算法使用误差平方和准则函数来评价聚类性能。给定数据集 X X X,假设 X X X包含 K K K个聚类自己 x 1 , x 2 , ⋅ ⋅ ⋅ , x k x_1,x_2,···,x_k x1,x2,,xk;将此数据集划分为 K K K类, m i m_i mi是第 i i i类的聚类中心,数据 x j x_j xj属于第 i i i C i C_i Ci。则误差平方和准则函数(代价函数)公式为: V = ∑ i = 1 K [ ∑ x j ∈ C i ∣ ∣ x j − m i ∣ ∣ 2 ] V=\sum_{i=1}^K{\left[ \sum_{x_j\in C_i}{||x_j-m_i||^2} \right]} V=i=1KxjCixjmi2
聚类过程就是寻找最佳聚类中心 m i ( i = 1 , 2 , ⋅ ⋅ ⋅ , K ) m_i(i=1,2,···,K) mi(i=1,2,K)使得代价函数 V V V为最小的过程。

K-均值算法的一般步骤

①输入待分类的数据集 X = x 1 , x 2 , ⋅ ⋅ ⋅ , x N X={x_1,x_2,···,x_N} X=x1,x2,xN,选定分类数K。

②初始化。从数据集 X X X中选取 K K K个元素,作为 K K K C 1 , C 2 , ⋅ ⋅ ⋅ , C K {C_1,C_2,···,C_K} C1,C2,,CK的初始聚类中心 { m 1 ( 0 ) , m 2 ( 0 ) , ⋅ ⋅ ⋅ , m k ( 0 ) } \left\{m_1(0),m_2(0),···,m_k(0)\right\} {m1(0),m2(0),,mk(0)},其中, m i ( n ) m_i(n) mi(n)表示第 i i i C i C_i Ci在第 n n n次迭代后新的聚类中心。

③将数据归类。根据欧氏距离,依次计算每个数据到各类中心的距离,并比较这些距离的大小,按最小距离准则将各数据划分到离它最近的那个聚类中心所在的类。

④修正聚类中心。重新计算 K K K个聚类的中心 { m 1 ( j ) , m 2 ( j ) , ⋅ ⋅ ⋅ , m k ( j ) } \left\{m_1(j),m_2(j),···,m_k(j)\right\} {m1(j),m2(j),,mk(j)},其中, m k ( j ) = ( ∑ x m ∈ C i x m ) n m_k\left( j \right) =\frac{\left( \sum_{x_m\in C_i}{x_m} \right)}{n} mk(j)=n(xmCixm)表示第 j j j次划分后聚类 C i C_i Ci的中心, n i n_i ni为当前 C i C_i Ci中数据的个数,在这一步中,因为需要计算 K K K类的均值作为聚类中心,所以称为 K K K类的均值作为聚类中心,所以称为K-均值算法。

⑤判断分类是否结束。若第 j − 1 j-1 j1次划分后的聚类中心和第 j j j次划分后的聚类中心不同,即 m i ( j ) m_i(j) mi(j)不等于 m i ( j − 1 ) m_i(j-1) mi(j1),则继续执行步骤③④的聚类调整。直至连续两次迭代后的聚类中心没有发生变化,则算法收敛,聚类结束,此时代价函数 V V V最小,数据集 X X X被划分成 K K K个聚类。

下面我尝试着编写该K-均值算法;

import numpy as np
import matplotlib.pyplot as plt
import math
#定义样本集 20个样本,每个样本有两个特征
x =np.array([[0,2,0,1,2,1,2,3,6,7,8,6,7,8,9,7,8,9,8,9],[0,0,1,1,1,2,2,2,6,6,6,7,7,7,7,8,8,8,9,9]])
x
array([[0, 2, 0, 1, 2, 1, 2, 3, 6, 7, 8, 6, 7, 8, 9, 7, 8, 9, 8, 9],
       [0, 0, 1, 1, 1, 2, 2, 2, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9]])
# 选定分类系数为K
k = 2
np.shape(x)
len(x[0])
20
i=1
x_y=x[:,i]
print(x_y)
[2 0]
print(x_y[0])
2
#初始化,从数据集中选取K个元素作为K类
m_1=x[:,0]
m_2=x[:,1]
print(m_2)
[2 0]
d = math.sqrt((m_2[0]-m_2[0])**2+(m_2[1]-m_2[1])**2)
d
0.0
c1=[]
c1.append(m_1)
c1.append(m_2)
print(c1)
np.mean(c1,axis=0)

[array([0, 0]), array([2, 0])]





array([1., 0.])
c1=[]
c2=[]
for i in range(0,len(x[1])):
    for i in range(0,20):
        xy=x[:,i]
        d1 = math.sqrt((m_1[0]-xy[0])**2+(m_1[1]-xy[1])**2)
        d2 = math.sqrt((m_2[0]-xy[0])**2+(m_2[1]-xy[1])**2)
        if d1<d2:
            c1.append(xy)
            #print(c1)
        else:
            c2.append(xy)
        #print(c2)
        #print(c1)
        #print(c2)
        mean1 = np.mean(c1,axis=0)
        mean2 = np.mean(c2,axis=0)
        mean1_pro = m_1 #先令mean1_pro=m_1,为下面更新做铺垫
        mean2_pro = m_2
    if all(mean1==mean1_pro) and all(mean2==mean2_pro):
        break
    else:
        mean1_pro = mean1# 如果不相等则令当前的聚类中心为mean1_pro
        mean2_pro = mean2
print(mean1)
print(mean2)

[1.375 1.125]
[7.66666667 7.33333333]
c1
[array([0, 0]),
 array([2, 0]),
 array([0, 1]),
 array([1, 1]),
 array([2, 1]),
 array([1, 2]),
 array([2, 2]),
 array([3, 2])]
c=c1[1]
print(c)
c[0]
[2 0]


2
for i in range(0,len(c1)):
    c=c1[i]
    plt.plot(c[0],c[1],'o',c='r')

for i in range(0,len(c2)):
    c=c2[i]
    plt.plot(c[0],c[1],'o',c='g')

聚类效果图如下所示:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值