java k均值相异度计算_聚类分析(二)K-均值聚类(KMeans算法)

本文介绍了KMeans聚类算法的基本思想和流程,强调了初始类聚类中心选取的重要性。通过Java示例展示了如何使用Scikit-Learn库进行KMeans聚类,讨论了算法的优缺点,并提供了数据处理和可视化的方法。
摘要由CSDN通过智能技术生成

基本思想

这种聚类方法的思想是把每个样品聚集到其最近均值的类中,在它的最简单说明中,这个过程由下列三步所组成:

(1)把样品粗略分成K个初始类。

(2)进行修改,逐个分派样品到其最近均值的类中(通常用标准化数据或非标准化数据计算欧式距离)。重新计算接受新样品的类和失去样品的类的形心(均值)。

(3)重复第二步,直到各类无元素进出。

KMeans算法流程

KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

算法过程:

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

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

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

(4)迭代二、三步直至新的质心与原质心相等或小于指定阈值,算法结束。

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

60d39a92501edcfb245b8d5cc7c6da8b.png

下面将使用Scikit-Learn的KMeans来进行聚类:

KMeans聚类首先需要确定聚类中心的数量,所以在进行聚类之前,需要对自己的数据的含义和属性有一定的了解。如果是二维的数据,可以先画一个散点图看一下样本的分布情况,如:

2f6e68fb5f4cc9ed20403bfcac21dc52.png

从图像中的数据分布可以看出,样本点大致分为四簇。所以设置初始聚类中心 k=4,如果对数据不是很了解,可以先设置一个k,sklearn.cluster中的KMeans,n_clusters的默认值为8,进行聚类之后,再根据结果的聚类效果来调整聚类中心的数量。

先导入需要的程序包

import matplotlib.pyplot as plt

import numpy as np

from sklearn.cluster import KMeans

然后进行数据的处理,将数据处理成符合模型要求的数组

def file2matrix(file_name, separator):

# 数据的预处理

data_list = []

with open(file_name) as file:

for i in file.readlines():

c = i.strip().split(separator)

for j in range(len(c)):

c[j] = eval(c[j])

data_list.append(c)

return np.array(data_list)

画出散点图和聚类中心

def draw_pic(data_list):

# 画出散点图

for x in range(len(data_list)):

plt.scatter(data_list[x][0], data_list[x][1], s=30, c='b', marker='.')

def draw_cluster_centers(centers_mat):

# 画出聚类中心

for k in range(len(centers_mat)):

plt.scatter(centers_mat[k][0], centers_mat[k][1], s=60, c='r', marker='D')

执行程序,调用相应的函数,进行KMeans聚类,kmeans.cluster_centers_方法返回的是聚类中心的数据点

if __name__ == '__main__':

data_Set = file2matrix('testSet.txt', '\t')

draw_pic(data_Set)

k = 4 # 确定聚类中心的数目

# 执行KMeans算法

kmeans = KMeans(n_clusters=k)

kmeans.fit(np.mat(data_Set))

draw_cluster_centers(kmeans.cluster_centers_)

plt.show()

最终得到结果

067d57bda994bd27edec37845e4e6b8b.png

优点:(1)KMeans算法擅长处理球状分布的数据

(2)简单,容易掌握

缺点:(1)k的取值需要根据经验,没有可借鉴性

(2)对异常偏离的数据非常敏感

参考:

1.机器学习算法原理与编程实践/郑捷著. 北京:电子工业出版社,2015.11

2.多元统计分析/何晓群编著.  -4版. --北京:中国人民大学出版社,2015.3

如果有需要测试数据集的,可以在下方评论处留下邮箱,欢迎关注。

47aac79194dc1daadc901c65042104c9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值