LBG算法 - 我可以使用现有的k-means算法吗?

时间:2015-01-19 23:51:38

标签: c# algorithm

我正在编写一个比较k-means和LBG算法的工作程序。

我编写了一个k-means算法,它接受一个点列表和簇数,然后在屏幕上以不同的颜色绘制它们。它返回一个聚类列表,其中包含分配给它们的点列表。

现在,我的问题是:我可以以某种方式修改我的k-means来获得LBG算法吗?我尝试在线搜索LBG的一步一步解释,但维基百科上只有3个句子,我发现了数学家解释,其中包括4行代码,以及你必须购买的原始论文。有人可以解释/指点我这个指南吗?

谢谢。

编辑:拜托,没有非常难的技术论文,我用英语无法正确阅读。

Edit2:这是我的k-means类的代码:

public class k_means
{
    public static List<Punktyzbior> oblicz(Punktyzbior punkty, int klasterctr)
    {
        List<Punktyzbior> wszystkieklastry = new List<Punktyzbior>();
        List<List<Punkt>> wszystkiegrupy = pomocnicze_listy.PodzielListe<Punkt>(punkty, klasterctr);
        foreach (List<Punkt> grupa in wszystkiegrupy)
        {
            Punktyzbior klaster = new Punktyzbior();
            klaster.AddRange(grupa);
            wszystkieklastry.Add(klaster);
        }

        int przejscia = 1;
        while (przejscia > 0)
        {
            przejscia = 0;

            foreach (Punktyzbior klaster in wszystkieklastry)
            {
                for (int punktIdx = 0; punktIdx < klaster.Count; punktIdx++)
                {
                    Punkt punkt = klaster[punktIdx];

                    int najblizszyklaster = znajdzNajblizszy(wszystkieklastry, punkt);
                    if (najblizszyklaster != wszystkieklastry.IndexOf(klaster))
                    {
                        if (klaster.Count > 1)
                        {
                            Punkt usunPunkt = klaster.usunPunkt(punkt);
                            wszystkieklastry[najblizszyklaster].dodajPunkt(usunPunkt);
                            przejscia += 1;
                        }
                    }
                }
            }
        }

        return (wszystkieklastry);
    }

    public static int znajdzNajblizszy(List<Punktyzbior> wszystkieklastry, Punkt punkt)
    {
        double minOdl = 0.0;
        int najblizszyCIdx = -1;

        for (int k = 0; k < wszystkieklastry.Count; k++)
        {
            double odl = Punkt.znajdzOdl(punkt, wszystkieklastry[k].c);
            if (k == 0)
            {
                minOdl = odl;
                najblizszyCIdx = 0;
            }
            else if (minOdl > odl)
            {
                minOdl = odl;
                najblizszyCIdx = k;
            }
        }

        return (najblizszyCIdx);
    }
}

1 个答案:

答案 0 :(得分:1)

而不是试图从kmeans到LBG,我宁愿尝试翻译&#34;这个java代码到c#,我觉得它会容易得多。

尝试这样做,如果您对实施有特定问题,请告诉我们。

https://github.com/internaut/JGenLloydCluster/blob/master/src/net/mkonrad/cluster/GenLloyd.java