Kmeans++算是DONet实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Random random = new Random(Math.Abs(unchecked((int)DateTime.Now.Ticks)));
List<Coordinate> rawData = new List<Coordinate>();
for (int i = ; i < ; i++)
{
rawData.Add(new Coordinate { X = random.Next(, ), Y = random.Next(, ) });
} KmeansPlus plus = new KmeansPlus();
plus.Data = rawData;
plus.K = ;
plus.ShortDistance = ;
plus.Start();
DrawPoint(rawData, plus.Means, plus.Clustering);
Console.ReadLine();
} /// <summary>
/// 绘制图片显示出来
/// </summary>
/// <param name="vector"></param>
/// <param name="mean"></param>
/// <param name="clustering"></param>
static void DrawPoint(List<Coordinate> vector, List<Coordinate> mean, int[] clustering)
{
Bitmap bit = new Bitmap(, );
Graphics g = Graphics.FromImage(bit);
g.Clear(Color.White);
SolidBrush Black = new SolidBrush(Color.Black);
SolidBrush Red = new SolidBrush(Color.Red);
List<Color> ColorList = new List<Color>();
ColorList.Add(Color.MediumOrchid);
ColorList.Add(Color.DeepPink);
ColorList.Add(Color.Blue);
ColorList.Add(Color.Brown);
ColorList.Add(Color.Coral);
ColorList.Add(Color.CornflowerBlue);
ColorList.Add(Color.DarkCyan);
ColorList.Add(Color.DarkGreen);
ColorList.Add(Color.DarkMagenta);
ColorList.Add(Color.DarkRed);
ColorList.Add(Color.DodgerBlue);
Font f = new Font("宋体", );
for (int i = ; i < vector.Count; i++)
{
Coordinate p = vector[i]; g.FillEllipse(Black, Convert.ToInt32(p.X), Convert.ToInt32(p.Y), , ); } for (int i = ; i < vector.Count; i++)
{
Coordinate p = vector[i];
int color = clustering[i];
g.DrawString(color.ToString(), f, new SolidBrush(ColorList[color]), Convert.ToInt32(p.X), Convert.ToInt32(p.Y)); }
int j = ;
foreach (Coordinate p in mean)
{ g.FillEllipse(new SolidBrush(ColorList[j]), Convert.ToInt32(p.X), Convert.ToInt32(p.Y), , );
j++;
}
bit.Save(@"E:\Debug\" + DateTime.Now.Millisecond + ".png", ImageFormat.Png);
}
} }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
public class Kmeans
{
public int[] Cluster(List<Coordinate> rawData, List<Coordinate> means, ref List<Coordinate> endmeans)
{ List<Coordinate> data = rawData; bool changed = true; int[] clustering = null; int maxCount = data.Count * ; // sanity check
int ct = ;
while (changed == true && ct < maxCount)
{
++ct;
int[] _clustering = new int[data.Count];
List<Coordinate> _means = new List<Coordinate>();
changed = UpdateMeans(data, means, clustering, ref _clustering, ref _means);
means = _means; clustering = _clustering;
}
endmeans = means; return clustering;
} /// <summary>
/// 计算核心点和聚类点。
/// </summary>
/// <param name="data">原始数据</param>
/// <param name="means">上一次的中心点</param>
/// <param name="clustering">上一次的聚类点</param>
/// <param name="newclustering">返回新的中心点</param>
/// <param name="newmeans">返回新的聚类点</param>
/// <returns>是否发生更新。</returns>
private static bool UpdateMeans(List<Coordinate> data, List<Coordinate> means, int[] clustering, ref int[] newclustering, ref List<Coordinate> newmeans)
{
newclustering = new int[data.Count];
int[] clusterCounts = new int[means.Count];
for (int i = ; i < data.Count; i++)
{
int _clusting = MinIndex(data[i], means);
newclustering[i] = _clusting;
clusterCounts[_clusting]++;
}
List<Coordinate> _means = new List<Coordinate>();
for (int i = ; i < means.Count; i++)
{
Coordinate p = new Coordinate { X = , Y = };
_means.Add(p); }
for (int i = ; i < data.Count; ++i)
{
int cluster = newclustering[i];
_means[cluster].X += data[i].X; // accumulate sum
_means[cluster].Y += data[i].Y; // accumulate sum
}
newmeans = new List<Coordinate>();
for (int k = ; k < _means.Count; ++k)
{ double x = _means[k].X / clusterCounts[k]; // danger of div by 0
double y = _means[k].Y / clusterCounts[k]; // danger of div by 0
Coordinate p = new Coordinate { X = x, Y = y };
newmeans.Add(p);
}
if (clustering == null)
{
return true;
}
else
{
for (int i = ; i < newclustering.Length; i++)
{
if (newclustering[i] != clustering[i])
{
return true;
}
}
}
return false;
} /// <summary>
/// 计算点到核心点距离获取最小距离点索引;
/// </summary>
/// <param name="p"></param>
/// <param name="means"></param>
/// <returns></returns>
private static int MinIndex(Coordinate p, List<Coordinate> means)
{
double[] distances = new double[means.Count];
for (int i = ; i < means.Count; i++)
{
distances[i] = Distance(p, means[i]);
}
int indexOfMin = ;
double smallDist = distances[];
for (int k = ; k < distances.Length; ++k)
{
if (distances[k] < smallDist)
{
smallDist = distances[k];
indexOfMin = k;
}
}
return indexOfMin;
}
/// <summary>
/// 距离计算
/// </summary>
/// <param name="tuple"></param>
/// <param name="mean"></param>
/// <returns></returns>
public static double Distance(Coordinate tuple, Coordinate meas)
{
double sumSquaredDiffs = 0.0;
sumSquaredDiffs += Math.Pow((tuple.X - meas.X), );
sumSquaredDiffs += Math.Pow((tuple.Y - meas.Y), );
return Math.Sqrt(sumSquaredDiffs);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
public class KmeansPlus
{
private int _k = ;
private int _shortdistance = ; /// <summary>
/// 初始设置值
/// </summary>
public int K { get { return this._k; } set { this._k = value; } }
/// <summary>
/// 最短距离合并
/// </summary>
public int ShortDistance { get { return this._shortdistance; } set { this._shortdistance = value; } }
/// <summary>
/// 初始数据
/// </summary>
public List<Coordinate> Data { get; set; }
/// <summary>
/// 返回中心点信息
/// </summary>
public List<Coordinate> Means { get; set; }
/// <summary>
/// 数据分组信息
/// </summary>
public int[] Clustering { get; set; }
public void Start()
{
Random random = new Random(Math.Abs(unchecked((int)DateTime.Now.Ticks))); List<Coordinate> means = new List<Coordinate>(); int maxlength = Data.Count - ;
int measpoint = random.Next(, maxlength);
means.Add(Data[measpoint]); List<Coordinate> result = new List<Coordinate>();
for (int i = ; i < Data.Count; i++)
{
result.Add(Data[i]);
}
result.Remove(Data[measpoint]);
for (int i = ; i < K; i++)
{
List<Coordinate> nextresult = new List<Coordinate>();
means = UpdateCompass(result, means, ref nextresult);
result = nextresult;
} means = MergeMeans(means, ShortDistance); List<Coordinate> Lmeans = new List<Coordinate>();
int[] clustering = new Kmeans().Cluster(Data, means, ref Lmeans); Clustering = clustering;
Means = Lmeans;
}
/// <summary>
/// 罗盘法随机核心点
/// </summary>
/// <param name="data">点</param>
/// <param name="meas">中心点</param>
/// <param name="result">去除核心点的数组,下一次使用</param>
/// <returns></returns>
private static List<Coordinate> UpdateCompass(List<Coordinate> data, List<Coordinate> meas, ref List<Coordinate> result)
{
double[] distance = new double[data.Count];
result = new List<Coordinate>();
double sumlength = ;
for (int j = ; j < data.Count; j++)
{
double[] _distance = new double[meas.Count];
for (int i = ; i < meas.Count; i++)
{
_distance[i] = Kmeans.Distance(data[j], meas[i]);
}
double min = _distance.Min();
distance[j] = min;
sumlength += min;
}
Random random = new Random(Math.Abs(unchecked((int)DateTime.Now.Ticks)));
double measpoint = random.Next(, Convert.ToInt32(sumlength)); int _postion = ;
for (int j = ; j < distance.Length; j++)
{
if ((measpoint - distance[j]) <= )
{
_postion = j; }
measpoint -= distance[j];
}
meas.Add(data[_postion]); data.Remove(data[_postion]);
result = data; return meas;
} /// <summary>
/// 合并中心
/// </summary>
/// <param name="meas">中心点</param>
/// <param name="len">合并最小距离</param>
/// <returns></returns>
private static List<Coordinate> MergeMeans(List<Coordinate> means, int len)
{ for (int i = ; i < means.Count - ; i++)
{
for (int j = ; j < means.Count; j++)
{
if (i == j)
{
continue;
}
double l = Kmeans.Distance(means[i], means[j]);
if (l < len)
{
means.Remove(means[j]);
j--;
}
}
} return means;
}
//private static double Distance(Coordinate tuple, Coordinate meas)
//{
// double sumSquaredDiffs = 0.0;
// sumSquaredDiffs += Math.Pow((tuple.X - meas.X), 2);
// sumSquaredDiffs += Math.Pow((tuple.Y - meas.Y), 2);
// return Math.Sqrt(sumSquaredDiffs);
//}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
[Serializable]
public class Coordinate
{
public double X { get; set; }
public double Y { get; set; }
}
}
Kmeans++算是DONet实现的更多相关文章
- 记录近期小改K-Means至MapReduce上的心得
背景: 在所有聚类算法中KMeans算是表面上最简单的一种,没有过多恼人的古希腊符号公式,没有过分繁杂的公式嵌套.对于一个初学矩阵或者仅有向量概念的非专业人士的来说,不可不畏是一把踹门利器.这个世界上 ...
- EM 算法(二)-KMeans
KMeans 算法太过简单,不再赘述 本文尝试用 EM 算法解释 KMeans,而事实上 KMeans 算是 EM 的一个特例 EM 算法是包含隐变量的参数估计模型,那对应到 KMeans 上,隐变量 ...
- 【机器学习】聚类算法:层次聚类、K-means聚类
聚类算法实践(一)--层次聚类.K-means聚类 摘要: 所谓聚类,就是将相似的事物聚集在一 起,而将不相似的事物划分到不同的类别的过程,是数据分析之中十分重要的一种手段.比如古典生物学之中,人们通 ...
- Canopy算法计算聚类的簇数
Kmeans算是是聚类中的经典算法.步骤例如以下: 选择K个点作为初始质心 repeat 将每一个点指派到近期的质心,形成K个簇 又一次计算每一个簇的质心 until 簇不发生变化或达到最大迭代次数 ...
- 【原创】数据挖掘案例——ReliefF和K-means算法的医学应用
数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识.数据挖掘 (DataMiriing),指的是从大型数据库或数据仓库中提取人们感兴趣的知识,这些知识是隐含的.事先未知 ...
- 【转】算法杂货铺——k均值聚类(K-means)
k均值聚类(K-means) 4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时 ...
- 二分K-means算法
二分K-means聚类(bisecting K-means) 算法优缺点: 由于这个是K-means的改进算法,所以优缺点与之相同. 算法思想: 1.要了解这个首先应该了解K-means算法,可以看这 ...
- k-means均值聚类算法(转)
4.1.摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在 ...
- 基于ReliefF和K-means算法的医学应用实例
基于ReliefF和K-means算法的医学应用实例 数据挖掘方法的提出,让人们有能力最终认识数据的真正价值,即蕴藏在数据中的信息和知识.数据挖掘 (DataMiriing),指的是从大型数据库或数据 ...
随机推荐
- b/s 读取多个FTP文件(图片,视频)压缩到服务器 下载到客户端
其实需求是这样, 要做一键导出, 有图片,有照片,youhtml,存在不同的文件夹,每次下载都必须下载最新数据,因为FTP是随时更新的. 1.这要是一直下载下载,浏览器一直跳窗口,蛋疼的我都看不下去. ...
- Python笔记总结week1
1. Python介绍: 发明者:Guido 应用范围:网络应用.科学运算.GUI程序.系统管理工具.其他程序 优势:简单易懂.开发效率高.高级语言.可移植性.可扩展性.可嵌入性. 缺点:速度慢,代码 ...
- 用ORBSLAM2运行TUM Dataset数据集
参照https://github.com/raulmur/ORB_SLAM2/blob/master/README.md 运行 4. Monocular Examples TUM Dataset 数据 ...
- [原创]在Linux系统Ubuntu14.04上安装部署docker。
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- (SenchaTouch+PhoneGap)开发笔记(1)开发环境搭建一
1.下载senchaTouch 2.下载senchaCMD 3.安装ruby(for windows ) 4.senchaCmd创建项目: 打开senchacmd,cd到senchaTouch的目录如 ...
- 浏览器主页被hao123贱贱的篡改的一种方式
今天打开一个PDF文件(正经文件,不要想歪了),误点了一个“编辑”按钮,出来发现浏览器主页被篡改了,包括chrome和IE.通过一个网址"www.qquuu8.com"跳转到hao ...
- vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
一.前言 三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习. 图片的上传之前都是用的插件(ajaxupload), ...
- winform学习笔记02
Hashtable 数据遍历的几种方式 ---Hashtable 在集合中称为键值对,它的每一个元素的类型是 DictionaryEntry,由于Hashtable对象的键和值都是Object类型,决 ...
- [并查集] POJ 1611 The Suspects
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 35206 Accepted: 17097 De ...
- Spring Quartz
Spring Quartz Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz: 首先我们来写一个被调度的类: pac ...