数据挖掘之KMeans算法应用与简单理解
一、背景
煤矿地磅产生了一系列数据:

我想从这些数据中,取出最能反映当前车辆重量的数据(有很多数据是车辆上磅过程中产生的数据)。我于是想到了聚类算法KMeans,该算法思想比较简单。
二、算法步骤
1、从样本中随机取出k个值,作为初始中心
2、以k个中心划分这些数据,分为k个组
3、重新计算出每个组的中心,作为新中心
4、如果初始中心和新中心不相等,则把新中心作为初始中心,重复2,3。反之,结束
注意:
1、我没有用严格的算法定义,怕不好理解
2、KMeans善于处理球形数据,因此随机取k个质心,每个质心吸引离它最近的数据
3、由于质心的取值是不科学的,所以需要不断地计算调整,直到质心名副其实
三、算法分析及特点
1、从算法步骤当中可以看出有两个问题,需要解决:
首先,如何计算每个组(簇)的质心?
其次,如何把值划分到不同的组?
2、解决上面两个问题,因场景和要求不同而有不同的小算法,由于我的数据是一维的,而不是点,所以可以简单处理:
a、以每个组的平均值作为质心
b、根据值离质心的距离(相减),选择距离最近的组加入
3、此算法有两个缺点:
1)某个组(簇)划分不充分,还可以再划分为更小的组。(容易陷入局部最优)
2)需要用户指定k,聚类结果对初始质心的选择较为敏感(初始选择不同,聚类结果可能不同)
4、优点:简单易理解和上手
四、实现
public class KMeans
{
/*
* 聚类函数主体。
* 针对一维 decimal 数组。指定聚类数目 k。
* 将数据聚成 k 类。
*/
public static decimal[][] cluster(decimal[] p, int k)
{
// 存放聚类旧的聚类中心
decimal[] c = new decimal[k];
// 存放新计算的聚类中心
decimal[] nc = new decimal[k];
// 存放放回结果
decimal[][] g;
// 初始化聚类中心
// 经典方法是随机选取 k 个
// 本例中采用前 k 个作为聚类中心
// 聚类中心的选取不影响最终结果
for (int i = ; i < k; i++)
c[i] = p[i];
// 循环聚类,更新聚类中心
// 到聚类中心不变为止
while (true)
{
// 根据聚类中心将元素分类
g = group(p, c);
// 计算分类后的聚类中心
for (int i = ; i < g.Length; i++)
{
nc[i] = center(g[i]);
}
// 如果聚类中心不同
if (!equal(nc, c))
{
c = nc;
nc = new decimal[k];
}
else
break;
}
return g;
}
/*
* 聚类中心函数
* 简单的一维聚类返回其算数平均值
* 可扩展
*/
public static decimal center(decimal[] p)
{
if (p.Length == ) return ;
return sum(p) / p.Length;
}
/*
* 给定 decimal 型数组 p 和聚类中心 c。
* 根据 c 将 p 中元素聚类。返回二维数组。
* 存放各组元素。
*/
public static decimal[][] group(decimal[] p, decimal[] c)
{
// 中间变量,用来分组标记
int[] gi = new int[p.Length];
// 考察每一个元素 pi 同聚类中心 cj 的距离
// pi 与 cj 的距离最小则归为 j 类
for (int i = ; i < p.Length; i++)
{
// 存放距离
decimal[] d = new decimal[c.Length];
// 计算到每个聚类中心的距离
for (int j = ; j < c.Length; j++)
{
d[j] = distance(p[i], c[j]);
}
// 找出最小距离
int ci = min(d);
// 标记属于哪一组
gi[i] = ci;
}
// 存放分组结果
decimal[][] g = new decimal[c.Length][];
// 遍历每个聚类中心,分组
for (int i = ; i < c.Length; i++)
{
// 中间变量,记录聚类后每一组的大小
int s = ;
// 计算每一组的长度
for (int j = ; j < gi.Length; j++)
if (gi[j] == i)
s++;
// 存储每一组的成员
g[i] = new decimal[s];
s = ;
// 根据分组标记将各元素归位
for (int j = ; j < gi.Length; j++)
if (gi[j] == i)
{
g[i][s] = p[j];
s++;
}
}
// 返回分组结果
return g;
} /*
* 计算两个点之间的距离, 这里采用最简单得一维欧氏距离, 可扩展。
*/
public static decimal distance(decimal x, decimal y)
{
return Math.Abs(x - y);
} /*
* 返回给定 decimal 数组各元素之和。
*/
public static decimal sum(decimal[] p)
{
decimal sum = 0.0M;
for (int i = ; i < p.Length; i++)
sum += p[i];
return sum;
} /*
* 给定 decimal 类型数组,返回最小值得下标。
*/
public static int min(decimal[] p)
{
int i = ;
decimal m = p[];
for (int j = ; j < p.Length; j++)
{
if (p[j] < m)
{
i = j;
m = p[j];
}
}
return i;
} /*
* 判断两个 decimal 数组是否相等。 长度一样且对应位置值相同返回真。
*/
public static bool equal(decimal[] a, decimal[] b)
{
if (a.Length != b.Length)
return false;
else
{
for (int i = ; i < a.Length; i++)
{
if (a[i] != b[i])
return false;
}
}
return true;
}
}
客户端调用:
static void Main(string[] args)
{
var path = string.Empty;
int k = ;
try
{
path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "blanceTest.txt");//数据文件路径
k = ;
}
catch (Exception)
{
Console.Write("参数错误");
return;
} decimal[] p = { , , , , , , , , , , , , , , , , , , , , , , , , }; List<decimal> pList = new List<decimal>(); var lines = File.ReadAllLines(path); foreach (var line in lines)
{
var data = System.Text.RegularExpressions.Regex.Replace(line, @" +", " ");
var datas = data.Split(' '); pList.AddRange(datas.Where(d => d != "").Select(d => Convert.ToDecimal(d)));
} p = pList.ToArray(); k = ;
decimal[][] g;
g = KMeans.cluster(p, k);
for (int i = ; i < g.Length; i++)
{
for (int j = ; j < g[i].Length; j++)
{
Console.WriteLine(g[i][j]);
}
Console.WriteLine("----------------------");
}
Console.ReadKey(); }
注意:
1、如果数据文件为空或不存在,则用初始化的p数组,作为测试数据
2、文件中的数据,见开篇截图
参考文章:
深入理解K-Means聚类算法
数据挖掘之KMeans算法应用与简单理解的更多相关文章
- 机器学习&数据挖掘笔记_14(GMM-HMM语音识别简单理解)
为了对GMM-HMM在语音识别上的应用有个宏观认识,花了些时间读了下HTK(用htk完成简单的孤立词识别)的部分源码,对该算法总算有了点大概认识,达到了预期我想要的.不得不说,网络上关于语音识别的通俗 ...
- [数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现
聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记 ...
- 数据挖掘入门系列教程(十)之k-means算法
简介 这一次我们来讲一下比较轻松简单的数据挖掘的算法--K-Means算法.K-Means算法是一种无监督的聚类算法.什么叫无监督呢?就是对于训练集的数据,在训练的过程中,并没有告诉训练算法某一个数据 ...
- K-Means 算法(转载)
K-Means 算法 在数据挖掘中, k-Means 算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means ...
- K-MEANS算法总结
K-MEANS算法 摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 在数据挖掘中,K-M ...
- 关于K-Means算法
在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means算法主要解决的问题如下图所示. ...
- 【机器学习笔记之一】深入浅出学习K-Means算法
摘要:在数据挖掘中,K-Means算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 在数据挖掘中,K-Means算法是一种c ...
- (转)深入浅出K-Means算法
原文地址:http://www.csdn.net/article/2012-07-03/2807073-k-means 摘要:在数据挖掘中,K-Means算法是一种 cluster analysis ...
- 深入浅出K-Means算法
在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means算法主要解决的问题如下图所示. ...
随机推荐
- LockWindowUpdate
//锁住listview防止反复刷新 LockWindowUpdate(Self.lvsearch.Handle); 貌似不太行,多用几下就卡住了 那个函数几乎不用 ...
- 35+个实用jQuery菜单插件
应用jQuery菜单插件可以让浏览者在浏览你的网页时获得最好的动态导航.jQuery是一个轻量级.跨浏览器的JavaScript框架(库),效果非常给力,它强调并简化了JavaScript.CSS和H ...
- SYN4104型 数字网同步时钟
SYN4104型 数字网同步时钟 产品概述 SYN4104型数字网同步时钟是由西安同步电子科技有限公司精心设计.自行研发生产的一款高精度锁相时钟频率源,接收GPS信号,使恒温晶振输出频率同步于GPS卫 ...
- Hadoop 三剑客之 —— 分布式计算框架 MapReduce
一.MapReduce概述 二.MapReduce编程模型简述 三.combiner & partitioner 四.MapReduce词频统计案例 4.1 项目简介 ...
- CSS样式规范
一般团队都有对CSS样式的规范,因为只有写的规范些,维护层本低,易懂.我们开发并不一次性的,往往都是要迭代的,如果这次随便写,下次迭代的时候将付出高昂的代价.而团队的规范一般都大同小异,往往都包含一下 ...
- Redis 学习笔记(篇一):字符串和链表
本次学习除了基本内容之外主要思考三个问题:why(为什么).what(原理是什么).which(同类中还有哪些类似的东西,相比有什么区别). 由于我对 java 比较熟悉,并且 java 中也有字符串 ...
- lodop+art-template实现web端漂亮的小票样式打印
一. 现状 由于之前采用Lodop打印控件(商业版付费,可以使用免费版 但是会有水印)去打印小票,是一行一行的打印,但是不满足UI给到复杂布局的小票样式,所以得重新考虑如何来实现. 二. 介绍 art ...
- gitlab安装笔记三_Centos7安装GitLab
系统版本是CentOS-7-x86_64-Everything-1804.iso,很多软件默认都有了,不需要安装 https://about.gitlab.com/install/#centos-7 ...
- 最全java多线程总结2--如何进行线程同步
上篇对线程的一些基础知识做了总结,本篇来对多线程编程中最重要,也是最麻烦的一个部分--同步,来做个总结. 创建线程并不难,难的是如何让多个线程能够良好的协作运行,大部分需要多线程处理的事情都不 ...
- 【设计模式】行为型06命令模式(Command Pattern)
命令模式 个人理解:命令模式,本质上是一种多层次的封装. 好处:降低耦合,扩展极其方便. 以下一段文案摘抄自:http://www.runoob.com/design-pattern/command- ...