Board logo

标题: 聚类(2) [打印本页]

作者: look_w    时间: 2019-4-17 18:57     标题: 聚类(2)

我找了一些资料  发现 聚类的运用 一般有三种: 数值聚类(例如成绩聚类)   文本的聚类    坐标点的聚类


数值聚类:

数值聚类是比较简单的  因为它们能直接求均值而不用做其他的一些处理

步骤是:

一: 随机产生是三个不重复的数值 作为 质心

二:计算每一个数值到质心的距离  公式 :     Math.Sqrt((x-质心)*(x-质心))   数值减去质心平方后开方

三:把数值归入到距离最小的 质心所代表的类中

四:计算每个类的均值作为质心,跟旧的质心做对比,如果不相等,则从步骤二开始 迭代。 直到质心值不再变化,这样类就分好了。


下面记录几段比较重要的代码;

1.生成不重复的随机数值

            /// <summary>
            /// get different random
            /// </summary>
            /// <param name="arrNum"></param>
            /// <param name="tmp"></param>
            /// <param name="minValue"></param>
            /// <param name="maxValue"></param>
            /// <param name="ra"></param>
            /// <returns></returns>
            public int[] getNum(int count, int total)
            {
                int[] index = new int[total];
                for (int i = 0; i < total; i++)
                {
                    index[i] = i;
                }
                Random r = new Random();
                //用来保存随机生成的不重复的count个数  
                int[] result = new int[count];
                //int site = total;//设置下限  
                int id;
                for (int j = 0; j < count; j++)
                {
                    id = r.Next(0, total - 1);
                    //在随机位置取出一个数,保存到结果数组  
                    result[j] = index[id];
                    //最后一个数复制到当前位置  
                    index[id] = index[total - 1];
                    //位置的下限减少一  
                    total--;
                }
     
                return result;
     
            }


判断新旧质心是否相等

            /// <summary>
            /// judge the value of center
            /// </summary>
            /// <param name="center"></param>
            /// <param name="newcenter"></param>
            /// <param name="ok"></param>
            /// <returns></returns>
            private static bool judge(double[] center, double[] newcenter, bool ok)
            {
                int count = 0;
                for (int i = 0; i < newcenter.Length; i++)
                {
                    if (center[i] == newcenter[i])
                    { count++; }
     
     
                }
                if (count == newcenter.Length)
                {
                    ok = true;
                }
                return ok;
            }




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0