k-means算法有个很大的缺点,就是对孤立点敏感性太高,孤立点即是脱离群众的点,与众不同的点,即在显示中与其他点不是抱在一团的点。

为了体现两者的不同,我特意温习了一下知识,在构造初始点的时候,自己定义加入了几个孤立点,使用k-means算法跑的效果如下:

一开始的所有点:(可以看出其他点是混在一起有许多分类的)

使用k-means算法运行,定义3个中心点:

可以看到,此时的确是被分成了三类,只不过两个孤立点算在了一类

那么试一下k中心点算法,初始:

运算之后:

就这么简单,就验证了k中心点算法的优越之处

1.算法理论

1.1 聚类

将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类。由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异。

简单的说,就是对于一组不知道分类标签的数据,可以通过聚类算法自动的把相似的数据划分到同一个分类中。即聚类与分类的区别主要在于,聚类可以不必知道源数据的标签信息。

1.2 算法描述

在K-means算法执行过程中,可以通过随机的方式选择初始质心,也只有初始时通过随机方式产生的质心才是实际需要聚簇集合的中心点,而后面通过不断迭代产生的新的质心很可能并不是在聚簇中的点。如果某些异常点距离质心相对较大时,很可能导致重新计算得到的质心偏离了聚簇的真实中心。这在我们上图也可以看到这种情况。

借用百度百科的算法步骤:

(1)随机选择k个代表对象作为初始的中心点

(2)指派每个剩余对象给离它最近的中心点所代表的簇

(3)随机地选择一个非中心点对象y

(4)计算用y代替中心点x的总代价s

(5)如果s为负,则用可用y代替x,形成新的中心点

(6) 重复(2)(3)(4)(5),直到k个中心点不再发生变化.

在网上看到一个例子,感觉过程还是挺清晰的。

2.代码运算实例

我在报告一开始已经将两种算法对比了一下效果,这里就再试一下,不存在孤立点时候的k中心点算法的表现:

依然是一个类,只要传入初始点的个数要定义的中心点个数,便可以画出一开始杂乱无序的图和经过k中心点算法训练后的图。首先看一下一开始的图,我定义了一千个点:

可以看出的确是十分杂乱,接下来看看运行算法后的效果:

不存在孤立点的情况,分出的效果与k-means算法还是大致差不多,如下为k-means运行的效果:

都是差不多的三等分。

3.算法学习心得

这次的实验还是比较简单的,在k-means算法的基础上,修改核心的中心点的划分部分即可。

还是那句话,python作为一个工具,实在是太方便了。

附录:k中心点算法python代码

# -*- coding: utf-8 -*-
# @Time    : 18-12-6
# @Author  : linfrom sklearn.datasets import make_blobs
from matplotlib import pyplot
import numpy as np
import randomclass KMediod():"""实现简单的k-medoid算法"""def __init__(self, n_points, k_num_center):self.n_points = n_pointsself.k_num_center = k_num_centerself.data = Nonedef get_test_data(self):"""产生测试数据, n_samples表示多少个点, n_features表示几维, centers得到的data是n个点各自坐标target是每个坐标的分类比如说我规定好四个分类,target长度为n范围为0-3,主要是画图颜色区别:return: none"""self.data, target = make_blobs(n_samples=self.n_points, n_features=2, centers=self.n_points)np.put(self.data, [self.n_points, 0], 500, mode='clip')np.put(self.data, [self.n_points, 1], 500, mode='clip')pyplot.scatter(self.data[:, 0], self.data[:, 1], c=target)# 画图pyplot.show()def ou_distance(self, x, y):# 定义欧式距离的计算return np.sqrt(sum(np.square(x - y)))def run_k_center(self, func_of_dis):"""选定好距离公式开始进行训练:param func_of_dis::return:"""print('初始化', self.k_num_center, '个中心点')indexs = list(range(len(self.data)))random.shuffle(indexs)  # 随机选择质心init_centroids_index = indexs[:self.k_num_center]centroids = self.data[init_centroids_index, :]   # 初始中心点# 确定种类编号levels = list(range(self.k_num_center))print('开始迭代')sample_target = []if_stop = Falsewhile(not if_stop):if_stop = Trueclassify_points = [[centroid] for centroid in centroids]sample_target = []# 遍历数据for sample in self.data:# 计算距离,由距离该数据最近的核心,确定该点所属类别distances = [func_of_dis(sample, centroid) for centroid in centroids]cur_level = np.argmin(distances)sample_target.append(cur_level)# 统计,方便迭代完成后重新计算中间点classify_points[cur_level].append(sample)# 重新划分质心for i in range(self.k_num_center):  # 几类中分别寻找一个最优点distances = [func_of_dis(point_1, centroids[i]) for point_1 in classify_points[i]]now_distances = sum(distances)   # 首先计算出现在中心点和其他所有点的距离总和for point in classify_points[i]:distances = [func_of_dis(point_1, point) for point_1 in classify_points[i]]new_distance = sum(distances)# 计算出该聚簇中各个点与其他所有点的总和,若是有小于当前中心点的距离总和的,中心点去掉if new_distance < now_distances:now_distances = new_distancecentroids[i] = point    # 换成该点if_stop = Falseprint('结束')return sample_targetdef run(self):"""先获得数据,由传入参数得到杂乱的n个点,然后由这n个点,分为m个类:return:"""self.get_test_data()predict = self.run_k_center(self.ou_distance)pyplot.scatter(self.data[:, 0], self.data[:, 1], c=predict)pyplot.show()test_one = KMediod(n_points=1000, k_num_center=3)
test_one.run()

k-medoid(k中心点)聚类算法Python实现相关推荐

  1. k中心点聚类算法伪代码_聚类算法之——K-Means、Canopy、Mini Batch K-Means

    K-Means||算法 K-Means||算法是为了解决K-Means++算法缺点而产生的一种算法: 主要思路是改变每次遍历时候的取样规则,并非按照K-Means++算法每次遍历只获取一个样本,而是每 ...

  2. 机器学习路程——k近邻(KNN)算法(python实现)

    使用python库sklearn,pandas 数据来源:kaggle Facebook V: Predicting Check Ins 数据网址:https://www.kaggle.com/c/f ...

  3. kmeans聚类算法python

    前言 日常生活中,从人脸识别.语音识别到搜索引擎,我们看到越来越多人工智能领域的算法逐渐走向落地.尽管全球每日新增数据量以PB或EB级别增长,但是大部分数据属于无标注甚至非结构化.所以相对于监督学习, ...

  4. K-means和PAM聚类算法Python实现及对比

    K-means(K均值划分)聚类:简单的说,一般流程如下:先随机选取k个点,将每个点分配给它们,得到最初的k个分类:在每个分类中计算均值,将点重新分配,划归到最近的中心点:重复上述步骤直到点的划归不再 ...

  5. 聚类分析 python_Kmeans聚类算法 python sklearn 用户画像

    1.基本概念: 聚类分析简称聚类(clustering),是一个把数据集划分成子集的过程,每一个子集是一个簇(cluster),使得簇中的样本彼此相似,但与其他簇中的样本不相似. 聚类分析不需要事先知 ...

  6. 数据挖掘学习——SOM网络聚类算法+python代码实现

    目录 1.SOM简述 2.SOM训练过程 (1)初始化 (2)采样(抽取样本点) (3)竞争 (4)合作和适应(更新权重值) (5)重复 3.python 代码实现 (1)初始化 (2)计算样本点和权 ...

  7. kmeans聚类算法python实例

    KMeans 聚类算法是一种基于距离的聚类算法,用于将数据点分成若干组.在 Python 中,可以使用 scikit-learn 库中的 KMeans 函数来实现 KMeans 聚类算法. 以下是一个 ...

  8. 机器学习教程 之 EM算法 :高斯混合模型聚类算法 (python基于《统计学习方法》实现,附数据集和代码)

    之前写过一篇博客讲述极大似然方法, 这一方法通常适用于知道观测数据 Y Y Y,求解模型参数 θ \theta θ的场合,即 P ( Y ∣ θ ) P(Y|\theta) P(Y∣θ). 但是,在更 ...

  9. kmeans中的k的含义_聚类的Python实现(二):确定分群数K

    对于KMeans算法聚类数k的选取非常重要,下面介绍两种常用的选择方法. 手肘法 手肘法的核心指标是SSE(sum of the squared errors,误差平方和): 其中,Ci是第i个簇,p ...

最新文章

  1. android sdk软件开发套件,ANDROIDSDK-SITARA
  2. 在Eclipse里Validating非常缓慢
  3. 4-1 图像特效介绍
  4. 深入理解分布式消息队列
  5. 关于EF使用脏读(连接会话开始执行设置隔离级别)
  6. leetcode455. 分发饼干(贪心算法)
  7. LeetCode 1819. 序列中不同最大公约数的数目
  8. access实例_西门子PLC1200组态王跟Access数据库-⑥组态王变量
  9. 《C++(三)--多线程方法总结》
  10. 阿里云商标注册查询入口(支持图形检索/45分类注册风险)
  11. 骨传导耳机靠谱吗?骨传导耳机是不是智商税?
  12. git冲突产生原因_Git 常见问题 冲突原因分析及解决方案
  13. SQL中over用法大全
  14. java int过长_java - 为什么长,不是int否则限制时间超过 - SO中文参考 - www.soinside.com...
  15. C语言基础知识入门(2022年)
  16. 纯html+css实现点击切换tab页
  17. 图像处理学习 灰度图像与二值图像
  18. [ZZ]AppiumForWindows 菜鸟计划合集
  19. 快狗打车CTO沈剑:低成本搞定分布式调用链追踪系统
  20. 团队第一次作业(软工C#造梦厂)

热门文章

  1. if else python格式_python 基本的if_else使用
  2. LaTex 插入图片技巧
  3. 市场新格局,分享购商业模式异军突起
  4. 学校的校园景点平面图(校园景点迷你地图C++数据结构)
  5. 深圳python培训比较好的机构-深圳python培训哪家好
  6. 背包问题C++(三种类型初涉)
  7. Spring Boot Admin在线查看spring boot后台日志
  8. 告别最好用的微软UWP应用OneNote 微软已经开始将其替换为Win32版
  9. Unity UGUI图文混排源码(二)
  10. 树莓派3b+快速编译opencv成功案例指导(保姆级教程)