k-means聚类以k个(也是要聚类的个数)随机的中心质点(centroid)开始,然后将每个待聚类的项分派到离它最近的簇。分派完之后,中心质点要进行移动:移动到该簇所有点的平均位置上。接着再次进行分配。这个过程反复的执行,直到中心质点的位置不再发生明显变化或者说分配后的点所属的簇不在变化。
具体来说是以下四步:
- (1) Start with k cluster centers (chosen randomly or according to some specific procedure).
- (2) Assign each row in the data to its nearest cluster center.
- (3) Re-calculate the cluster centers as the "average" of the rows in (2).
- (4) Repeat, until the cluster centers no longer change or some other stopping criterion has been met.
代码如下:
require 'mathn'
class Point#点的类:坐标及维度
attr :coords,:n
def initialize(coords)
@coords=coords
@n=coords.size
end
def to_s
@coords.to_s
end
end
class Cluster
attr :points,:n,:centroid#簇类:点的集合,维度,中心质点
def initialize(points)
if points.size==0
raise "ILLEGAL:EMPTY CLUSTER"
end
@points=points
@n=points[0].n
for p in points
if p.n!=@n
raise "ILLEGAL: MULTISPACE CLUSTER"
end
end
@centroid=calculateCentroid()
end
def update(points)
old_centroid=@centroid
@points=points
@centroid=calculateCentroid()
getDistance(old_centroid,@centroid)
end
def calculateCentroid
centroid_coords=[]
for i in 0..@n-1
centroid_coords<<0.0
for p in @points
centroid_coords[i] = centroid_coords[i]+p.coords[i]
end
centroid_coords[i] = centroid_coords[i]/@points.size
end
Point.new(centroid_coords)
end
def to_s
@points
end
end
def kmeans(points,k,cutoff)
initial=[]
clusters=[]
k.times do
initial<<points[rand(points.size-1)]
end
for p in initial
clusters<<Cluster.new([p])
end
while(true)
lists=[]
clusters.each{lists<<[]}
points.each do |p|
smallest_distance = getDistance(p,clusters[0].centroid)
index=0
for i in 0..(clusters.size-2)
distance=getDistance(p,clusters[i+1].centroid)
if distance<smallest_distance
smallest_distance=distance
index=i+1
end
end
lists[index]<<p
end
biggest_shift=0.0
for i in 0..(clusters.size-1)
shift=clusters[i].update(lists[i])
biggest_shift=(biggest_shift>shift)?biggest_shift : shift
end
if biggest_shift<cutoff
break;
end
end
clusters
end
def getDistance(a,b)
if a.n!=b.n
raise "ILLEGAL: NON-COMPARABLE POINTS"
end
ret=0.0
for i in 0..(a.n-1)
ret=ret+(a.coords[i]-b.coords[i])**2
end
Math.sqrt(ret)
end
def makeRandomPoint(n,lower,upper)
coords=[]
0.upto(n-1){coords<<lower+(upper-lower)*rand}
Point.new(coords)
end
num_points, n, k, cutoff, lower, upper = 10, 2, 3, 0.5, -200, 200
# Create num_points random Points in n-dimensional space
points = []
for i in 0..(num_points-1)
points<<makeRandomPoint(n, lower, upper)
end
# Cluster the points using the K-means algorithm
clusters = kmeans(points, k, cutoff)
# Print the results
puts "\nPOINTS:"
points.each {|p|print "P:", p.to_s,"\n"}
puts "\nCLUSTERS:"
clusters.each {|c|puts "C:", c.to_s}
分享到:
相关推荐
k-means算法是一种广泛应用的无监督学习方法,主要用于数据聚类。它的主要目标是将数据集分割成k个不同的簇,使得每个数据点都尽可能接近其所在簇的中心,而不同簇之间的数据点尽可能远离。在讲解k-means算法时,...
K-Means算法是机器学习领域中一种广泛应用的无监督聚类方法,它主要用于将数据集中的样本点划分到不同的类别或簇中。在模式识别中,K-Means算法常用于对未知分类的数据进行自动分组,以便于后续分析和理解。Matlab...
K-means算法 K-means算法是一种常用的无监督机器学习算法,用于对数据进行聚类分析。该算法的主要步骤包括:读取数据、快速PCA降维、归一化、Kmeans聚类。 读取数据:读取数据是K-means算法的第一步骤。在这个步骤...
**K-means算法详解** K-means是一种广泛应用的无监督学习方法,主要用于数据的聚类分析。它通过迭代过程将数据点分配到预定义数量(K)的类别中,目标是使得同一类别内的数据点相互接近,不同类别之间的数据点尽...
### 初始聚类中心优化的k-means算法 #### 概述 传统的k-means算法是一种广泛应用的数据挖掘技术,主要用于解决聚类问题。该算法通过迭代过程将数据集分割成多个簇(cluster),使得簇内数据点之间的差异尽可能小,而...
k-means算法是一种广泛应用的无监督学习方法,主要用于数据聚类。它的主要目标是将数据集中的样本点分成k个不同的簇(clusters),使得每个样本点都属于与其最近的簇中心。这个过程涉及到两个核心概念:簇(cluster...
### 人工智能作业K-MEANS算法的试验报告和源代码 #### 一、问题描述 本次人工智能课程的大作业要求学生实现并分析K-Means聚类算法在Iris数据集上的应用。Iris数据集是一个经典的多类别数据集,包含了150个样本,每...
《一种改进的K-means算法》 K-means算法是一种广泛应用的无监督学习方法,主要用于数据的聚类分析。在大数据领域,它以其简单高效的特点,成为处理大规模数据集的有效工具。然而,K-means算法也存在一些固有的局限...
### 数据挖掘中的K-Means算法详解 #### 一、K-Means算法概述 K-Means算法作为数据挖掘领域中的一种基本聚类方法,主要用于无监督学习场景下的数据分析与处理。它能够将相似的对象归类到同一组内,不同组间差异尽...
在遥感图像处理领域,K-means算法是一种广泛使用的无监督机器学习方法,用于将数据自动聚类到预设的类别中。Matlab作为一种强大的数值计算和数据分析工具,提供了便捷的环境来实现K-means算法。这篇教程将深入探讨...
### 国外实现K-Means算法:Java版本解析 #### 概述 K-Means算法是一种广泛使用的聚类算法,在数据挖掘、机器学习等领域有着重要的应用价值。本篇文章将详细解读一个由国外开发者提供的K-Means算法Java实现案例,并...
基于 K-means 算法的校园微博热点话题发现系统 一、研究目的 微博由其 “短平快 ” 的信息能力和快速传播能力 ,已广泛流行于高校学生的常生活中。但微博上的负面舆情信息给社会 、学校和个人带来巨大的危害 。由于...
K-Means算法是一种在数据挖掘领域广泛应用的无监督学习方法,主要用于对数据进行聚类。这个Java实现的K-Means算法具有可视化功能,可以让用户直观地理解聚类过程和结果。以下是对该算法及其Java实现的详细解析: 1....
关于k-means算法的源程序代码.%%%%%%函数说明%%%%%% %输入: % sample--样本集; % k--聚类数目; %输出: % y--类标; % cnew--聚类中心; % n--迭代次数; function [y cnew n]=k_means(sample,k)