Python 无监督聚类算法(K-means)原理和实现

K-means算法

       K-means算法是很典型的基于距离的聚类算法,算法采用误差平方和准则函数作为聚类准则函数,也是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

k个初始类聚类中心点的选取对聚类结果具有较大的

公式公式影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,J的值没有发生变化,说明算法已经收敛。

算法过程如下:

1)从N个文档随机选取K个文档作为质心

2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类

3)重新计算已经得到的各个类的质心

4)迭代2~3步直至新的质心与原质心相等或小于指定阈值,算法结束

具体如下:

输入:k, data[n];

(1) 选择k个初始中心点,例如c[0]=data[0],…c[k-1]=data[k-1];

(2) 对于data[0]….data[n],分别与c[0]…c[k-1]比较,假定与c[i]差值最少,就标记为i;

(3) 对于所有标记为i点,重新计算c[i]={ 所有标记为i的data[j]之和}/标记为i的个数;

(4) 重复(2)(3),直到所有c[i]值的变化小于给定阈值

折叠工作原理

K-MEANS算法的工作原理及流程

K-MEANS算法

输入:聚类个数k,以及包含 n个数据对象的数据库。

输出:满足方差最小标准的k个聚类。

 

代码与实现

 

O

x

y

1

0

2

2

0

0

3

1.5

0

4

5

0

5

5

2

6

3

2

 

 

 

 

 

 

 

 

要求:簇的数量k=3

部分代码:

import matplotlib.image as mpg
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random

data=np.array([[0,2],[0,0],[1.5,0],[5,0],[5,2],[3,2]])
randomValue=np.sort(random.sample(range(0,6),3))


#数据增加一个标签列
label=np.zeros(data.shape[0])
data=np.c_[data,label]

#提取三个初始的聚类中心数据出来
center1=data[0]
center2=data[1]
center3=data[2]
dsL=np.array([center1,center2,center3])
print('初始中心;\n',dsL)

#执行遍历,形成三个小山包
for  i in range(data.shape[0]):
    #计算与三个初始聚类中心的距离
    ds1=np.sqrt(np.sum(np.square(data[i,0:6]-center1)))
    ds2=np.sqrt(np.sum(np.square(data[i,0:6]-center2)))
    ds3=np.sqrt(np.sum(np.square(data[i,0:6]-center3)))
    #三个聚类标签1  centen1,2  center2,3   center3
    #比较大小,然后给出最小的距离所代表的那个聚类标签
    dsList=np.array([ds1,ds2,ds3])
    minIndex=np.argwhere(dsList==np.min(dsList))
    data[i,-1]=(minIndex+1)
   
#计算新的聚类中心
newData1=data[data[:,-1]==1]  #聚类为  1 的组的数据数
newData2=data[data[:,-1]==2]  #聚类为  2 的组的数据数
newData3=data[data[:,-1]==3]  #聚类为  3 的组的数据数
d1=np.array([newData1,newData2,newData3])
# print('第一组;\n',newData1) 
# print('第二组;\n',newData2) 
# print('第三组;\n',newData3) 
print('\n第一次聚类分组:\n',d1)

#计算新的聚类中心 new1   new2   new3

如需要计算600个数据实现的代码,请私聊

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值