机器学习:K-means和K-medoids对比[4]

简单对比一下这两者的区别。两者的主要区别主要在质心的选择中,k-means是样本点均值,k-medoids则是从样本点中选取。

首先给出两者的算法实现步骤:

K-means

1、随机选取K个质心的值 

2、计算各个点到质心的距离 

3、将点的类划分为离他最近的质心,形成K个cluster 

4、根据分类好的cluster,在每个cluster内重新计算质心(平均每个点的值)

5、重复迭代2-4步直到满足迭代次数或误差小于指定的值


K-medoids

1、随机选取K个质心的值 (质心必须是某些样本点的值,而不是任意值)

2、计算各个点到质心的距离 

3、将点的类划分为离他最近的质心,形成K个cluster 

4、根据分类好的cluster,在每个cluster内重新计算质心:

             4.1 计算cluster内所有样本点到其中一个样本点的曼哈顿距离和(绝对误差)

             4.2  选出使cluster绝对误差最小的样本点作为质心

5、重复迭代2-4步直到满足迭代次数或误差小于指定的值


以上就可以看出两者之间的区别:

k-means的质心是各个样本点的平均,可能是样本点中不存在的点。k-medoids的质心一定是某个样本点的值。


这个不同使他们具有不同的优缺点

1、k-medoids的运行速度较慢,计算质心的步骤时间复杂度是O(n^2),因为他必须计算任意两点之间的距离。而k-means只需平均即可。

2、k-medoids对噪声鲁棒性比较好。例:当一个cluster样本点只有少数几个,如(1,1)(1,2)(2,1)(100,100)。其中(100,100)是噪声。如果按照k-means质心大致会处在(1,1)(100,100)中间,这显然不是我们想要的。这时k-medoids就可以避免这种情况,他会在(1,1)(1,2)(2,1)(100,100)中选出一个样本点使cluster的绝对误差最小,计算可知一定会在前三个点中选取。


以上。虽然k-medoids也有优点,但是他只能对小样本起作用,样本一大,他的速度就太慢了,而且当样本多的时候,少数几个噪音对k-means的质心影响也没有想象中的那么重,所以k-means的应用明显比k-medoids多的多。


然后给出我实现的两者的Java代码。(呼,新年第一天我还在写代码,也真是不容易啊,注孤生 T-T)


花了一天的时间才写好调试好,这次是用的Java写的,自己实现的k-medoids和k-means。

K-medoids的大致流程是参考的网上的程序,在这:http://blog.sina.com.cn/s/blog_6adf9f370100qnet.html。不过我写的K-medoids跟他已经很不同了。


分别使用两种对11个二维数据进行分类,结果如下:




还只是简单的分析了下,之后会增加文件txt读入的功能,试着用稍微大点的数据来试试。不过白天因为调试也试了很多次。给我的感觉就是,k-medoids方法没有想象中对噪声鲁棒性那么好,或者说,他确实会对噪声鲁棒性好,但是他的结果偏差同样会很严重,在数据量不大的情况下。但是数据量一大,k-medoids方法就基本不能用了,因为这方法的时间复杂度是O(n^2),简直吓死人。。所以我个人分析的结果是k-medoids并没有想象中那么好,怪不得这方法一点都不常用,速度慢不说,误差也没有想象中降低那么明显。


注:上图中的minErr两者不同。k-medoids的是曼哈顿距离和,k-means的则是欧式距离和


代码如下:


pa
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值