java写质心,如何计算质心和数据矩阵之间的距离(对于kmeans算法)

这篇博客介绍了如何编写一个函数计算数据矩阵与中心点之间的欧氏距离,并实现了一个简单的k-means聚类算法。算法接受数据矩阵、中心点、距离函数和迭代次数作为参数,每次迭代更新簇分配和中心位置。博主通过随机生成的数据点展示了算法的运行过程,并比较了使用欧氏距离和相关距离两种不同距离度量的结果。此外,还讨论了如何根据需求灵活选择不同的距离度量进行聚类。
摘要由CSDN通过智能技术生成

您的主要问题似乎是如何计算数据矩阵与某些点(“中心”)之间的距离 .

为此,您可以编写一个函数,将数据矩阵和您的点集作为输入,并将数据矩阵中每行(点)的距离返回到所有“中心” .

这是一个这样的功能:

myEuclid

distanceMatrix

for(i in 1:nrow(points2)) {

distanceMatrix[,i]

}

distanceMatrix

}

points1 是数据矩阵,其中点为行,维度为列 . points2 是中心矩阵(再次指向行) . 第一行代码只定义了答案矩阵(它将具有与数据矩阵中的行一样多的行以及与中心一样多的列) . 因此结果矩阵中的点 i,j 将是从第i个点到第j个中心的距离 .

然后for循环遍历所有中心 . 对于每个中心,它计算从每个点到当前中心的欧氏距离并返回结果 . 这一行: sqrt(rowSums(t(t(points1)-points2[i,])^2)) 是欧几里德距离 . 如果你遇到任何麻烦,请仔细检查并查看公式 . (转置主要是为了确保减法是按行进行的) .

现在您还可以实现k-means算法:

myKmeans

clusterHistory

centerHistory

for(i in 1:nItter) {

distsToCenters

clusters

centers

# Saving history

clusterHistory[[i]]

centerHistory[[i]]

}

list(clusters=clusterHistory, centers=centerHistory)

}

正如您所看到的,它也是一个非常简单的函数 - 它需要数据矩阵,中心,距离函数(上面定义的函数)和有用的迭代次数 .

通过为每个点指定最近的中心来定义簇 . 并且中心更新为分配给该中心的点的平均值 . 这是一个基本的k-means算法) .

我们来试试吧 . 定义一些随机点(在2d中,所以列数= 2)

mat

从该矩阵中分配5个随机点作为初始中心:

centers

现在运行算法:

theResult

以下是第10次迭代的中心:

theResult$centers[[10]]

[,1] [,2]

1 -0.1343239 1.27925285

2 -0.8004432 -0.77838017

3 0.1956119 -0.19193849

4 0.3886721 -1.80298698

5 1.3640693 -0.04091114

将其与实现的 kmeans 函数进行比较:

theResult2

theResult2$centers

[,1] [,2]

1 -0.1343239 1.27925285

2 -0.8004432 -0.77838017

3 0.1956119 -0.19193849

4 0.3886721 -1.80298698

5 1.3640693 -0.04091114

工作良好 . 然而,我们的功能跟踪迭代 . 我们可以在前4次迭代中绘制进度,如下所示:

par(mfrow=c(2,2))

for(i in 1:4) {

plot(mat, col=theResult$clusters[[i]], main=paste("itteration:", i), xlab="x", ylab="y")

points(theResult$centers[[i]], cex=3, pch=19, col=1:nrow(theResult$centers[[i]]))

}

3cdfbc9c-ba40-41eb-bb6e-9354588674ec.png

尼斯 .

然而,这种简单的设计允许更多 . 例如,如果我们想要使用另一种距离(不是欧几里德),我们可以使用任何以数据和中心作为输入的函数 . 这是一个相关距离:

myCor

return(1 - ((cor(t(points1), t(points2))+1)/2))

}

然后我们可以根据这些来做Kmeans:

theResult

然后,4次迭代的结果图如下所示:

29822f3a-5ec0-46cb-a2fb-6c9e841f5397.png

即使你我们指定了5个集群 - 最后还有2个集群 . 这是因为对于2维,相关性可以具有值 - 1或-1 . 然后,在寻找聚类时,每个点都被分配到一个中心,即使它与多个中心的距离相同 - 第一个得到了 .

无论如何,现在这已超出范围 . 最重要的是,有许多可能的距离指标,一个简单的功能允许您使用您想要的任何距离,并通过迭代跟踪结果 .

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值