gpt4 book ai didi

f# - 使用 Accord.net 获取数据点到其质心的距离

转载 作者:行者123 更新时间:2023-12-01 04:50:55 27 4
gpt4 key购买 nike

我正在用 Accord.net library 做一些聚类工作.最终,我试图找到与 the elbow method 一起使用的最佳集群数。这需要一些相对简单的计算。但是,我很难获得所需的值,以确定要在 KMeans 中使用的最佳 K 数。造型。

我有一些示例数据/代码:

open Accord
open Accord.Math
open Accord.MachineLearning
open Accord.Statistics
open Accord.Statistics.Analysis

let x = [|
[|4.0; 1.0; 1.0; 2.0|];
[|2.0; 4.0; 1.0; 2.0|];
[|2.0; 3.0; 1.0; 1.0|];
[|3.0; 6.0; 2.0; 1.0|];
[|4.0; 4.0; 1.0; 1.0|];
[|5.0; 10.0; 1.0; 2.0|];
[|7.0; 8.0; 1.0; 2.0|];
[|6.0; 5.0; 1.0; 1.0|];
[|7.0; 7.0; 2.0; 1.0|];
[|5.0; 8.0; 1.0; 1.0|];
[|4.0; 1.0; 1.0; 2.0|];
[|3.0; 5.0; 0.0; 3.0|];
[|1.0; 2.0; 0.0; 0.0|];
[|4.0; 7.0; 1.0; 2.0|];
[|5.0; 3.0; 2.0; 0.0|];
[|4.0; 11.0; 0.0; 3.0|];
[|8.0; 7.0; 2.0; 1.0|];
[|5.0; 6.0; 0.0; 2.0|];
[|8.0; 6.0; 3.0; 0.0|];
[|4.0; 9.0; 0.0; 2.0|]
|]

我可以很容易地生成集群
let kmeans = new KMeans 5

let kmeansMod = kmeans.Learn x
let clusters = kmeansMod.Decide x

但是如何计算与任何给定数据点的距离 x分配给它的集群?我在 KMeans Cluster Collection class documentation 中没有看到任何内容这表明已经为这个问题实现了一种方法。

计算这个距离似乎应该相对简单,但我不知所措。会不会像做这样的事情一样简单
let dataAndClusters = Array.zip clusters x

let getCentroid (m: KMeansClusterCollection) (i: int) =
m.Centroids.[i]

dataAndClusters
|> Array.map (fun (c, d) -> (c, (getCentroid kmeansMod c)
|> Array.map2 (-) d
|> Array.sum))

返回
val it : (int * float) [] =
[|(1, 0.8); (0, -1.5); (1, -0.2); (0, 1.5); (0, -0.5); (4, 0.0); (2, 1.4);
(2, -3.6); (2, 0.4); (3, 0.75); (1, 0.8); (0, 0.5); (1, -4.2); (3, -0.25);
(1, 2.8); (4, 0.0); (2, 1.4); (3, -1.25); (2, 0.4); (3, 0.75)|]

我是否正确计算了这个距离?我怀疑不是。

正如我提到的,我希望确定 K 的正确数量。用于 KMeans聚类。我只是想我会使用 the second paragraph of this Stats.StackExchange.com answer 中列出的简单算法. 请注意,我不反对使用链接到顶部答案底部的“差距统计”。

最佳答案

原来我没有正确计算距离,但我很接近。

进一步挖掘,我看到了 this similar question, but for the R language并在我自己的 R 中分解了该公认答案中概述的过程 session 。

步骤似乎非常简单:

1. From each data value, subtract the centroid values
2. Sum the differences for a given data/centroid pair
3. Square the differences
4. Find the square root of the differences.

对于我上面的示例数据,它将分解为:
let distances = 
dataAndClusters
|> Array.map (fun (c, d) -> (c, ((getCentroid kmeansMod c)
|> Array.map2 (-) d
|> Array.sum
|> float) ** 2.0
|> sqrt))

注意添加了两行,

|> float) ** 2.0 converts the value to a float so that it can be squared (i.e., x**y)





|> sqrt) which finds the square root of the value.



可能有一种内置的方法可以做到这一点,但我还没有找到。目前,这对我有用。

关于f# - 使用 Accord.net 获取数据点到其质心的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41123785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com