gpt4 book ai didi

c# - 使用 KMeans 聚类算法查找部分成员资格

转载 作者:太空狗 更新时间:2023-10-29 17:53:16 28 4
gpt4 key购买 nike

我可以很容易地使用 KMeans 计算集群成员:

open System
open System.IO
open Utils
open Accord
open Accord.Math
open Accord.MachineLearning

let vals = [|
[|1.0; 2.0; 3.0; 2.0|]
[|1.1; 1.9; 3.1; 4.0|]
[|2.0; 3.0; 4.0; 4.0|]
[|3.0; 3.1; 2.0; 3.0|]
[|2.0; 4.0; 3.0; 6.0|]
[|1.0; 5.0; 5.0; 7.0|]
[|4.0; 3.0; 6.0; 8.0|]
[|5.0; 4.0; 3.0; 6.0|]
[|6.0; 4.0; 8.0; 7.0|]
[|5.0; 6.0; 5.0; 9.0|]
[|4.0; 2.0; 7.0; 8.0|]
[|8.0; 9.0; 3.1; 2.2|]
[|8.0; 9.0; 2.0; 2.0|]
[|10.0; 2.0; 3.0; 2.0|]
[|10.1; 1.9; 3.1; 4.0|]
[|20.0; 3.0; 4.0; 4.0|]
[|22.0; 7.0; 2.0; 3.0|]
[|21.0; 4.0; 3.0; 6.0|]
|]

let kmeans = new KMeans 5
let clusterModel = kmeans.Learn vals
let clusters = clusterModel.Decide vals

我可以使用标准 KMeans 算法计算部分成员资格吗?一位同事建议使用集群成员的均值和方差来确定比例成员,今天我一直在研究模糊集及其在 F# 中的实现。例如,here is some documentation for the Accord.net implementation for fuzzy sets.我可以翻译/运行 F# 的示例,但乍一看,我没有看到一种简单的方法来从上面运行的 Kmeans 中获取数据以适应以下格式分配部分成员资格。

问题:

  1. 我如何使用聚类成员的均值/方差来计算部分成员资格?

  2. 是否有使用 Accord.net 库使用 KMeans 聚类计算部分成员资格的简单方法?

  3. Accord.net 中的 KMeans 算法实现简单;我应该花一些时间尝试学习这种聚类/成员关系方法来解决我的问题,而不是尝试强制 Kmeans 聚类来满足我的需要吗?

最佳答案

正如 Tomas 所提到的,Accord.NET 已经为您提供了许多构建 block 。特别是,调用 clusterModel.Scores 可为您提供到集群质心的(负)距离,see source code

根据负距离,您可以通过取指数来计算近似的类成员分数,类似于您计算高斯 PDF 的方法。在 F# 中,它看起来像:

// Scores returns the negative distances between each point
// and the cluster centroid
let negDistances = clusterModel.Scores vals
// Compute an estimated cluster assigment score
let clusterMembership =
negDistances
|> Array.map (fun distances ->
// Take the Exponential of the (negative) distances,
// as in computing a Gaussian pdf
let expDist = distances |> Array.map Math.Exp
let total = Array.sum expDist
expDist
|> Array.map (fun d -> d/total)
)

这里有几个注意事项:

  • Accord 中的标准 KMeans 使用欧氏距离,这意味着每个方向具有相同的权重。根据您的数据的性质,这可能不会产生合理的结果(图片 2 个簇,每个簇的形状都像一根长雪茄)
  • 上述类成员计算也没有考虑聚类协方差。为了更接近真相,您必须计算 Bhattacharyya 距离、求幂,然后按协方差矩阵的逆 det 进行缩放。这对于单例集群会失败。

关于您的第三个问题:我不会重新实现。最初看起来很容易,但通常会有很多极端情况和稳定性问题,您只会在一段时间后才会遇到。

关于c# - 使用 KMeans 聚类算法查找部分成员资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41248146/

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