当前位置: 首页 > news >正文

人工智能|机器学习——Canopy聚类算法(基于密度)

1.简介

Canopy聚类算法是一个将对象分组到类的简单、快速、精确地方法。每个对象用多维特征空间里的一个点来表示。这个算法使用一个快速近似距离度量和两个距离阈值T1 > T2 处理。

Canopy聚类很少单独使用, 一般是作为k-means前不知道要指定k为何值的时候,用Canopy聚类来判断k的取值

2.算法步骤

输入:所有点的集合D, 超参数:T1 , T2 , 且 T1 > T2 

输出:聚类好的集合

注意

  • 当T1过大时,会使许多点属于多个Canopy,可能会造成各个簇的中心点间距离较近,各簇间区别不明显;
  • 当T2过大时,增加强标记数据点的数量,会减少簇个个数;
  • T2过小,会增加簇的个数,同时增加计算时间;

一幅图说明算法:

内圈的一定属于该类, 外圈的一定不属于该类, 中间层的可能属于别的类(因为不止一个聚类中心, 他可能属于别的类的内圈);

3.python实现

对iris数据集做Canopy聚类, 半径分别设置为1和2

#%% Canopy聚类
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import copyclass Solution(object):def Canopy(self, x, t1, t2):'''Parameters----------x : array数据集.t1 : float外圈半径.t2 : float内圈半径.Returns-------result: list.聚好类的数据集'''if t1 < t2:return print("t1 应该大于 t2")x = copy.deepcopy(x)result = []  # 用于存放最终结果index = np.zeros((len(x),))   # 用于标记外圈外的点 1表示强标记, 2表示弱标记while (index == np.zeros((len(x),))).any():alist = []  # 用于存放某一类的数据集choice_index = Nonefor i, j in enumerate(index):if j == 0:choice_index = ibreakC = copy.deepcopy(x[choice_index])alist.append(C)x[choice_index] = np.zeros((1, len(x[0])))index[choice_index] = 1for i,a in enumerate(x):if index[i] != 1:distant = (((a-C)**2).sum())**(1/2)if distant <= t2:  # 打上强标记alist.append(copy.deepcopy(x[i]))x[i] = np.zeros((1, len(x[0])))index[i] = 1elif distant <= t1:index[i] = 2result.append(alist)return resultdef pint(r, x, y, c):# 点的横坐标为aa = np.arange(x-r,x+r,0.0001)# 点的纵坐标为bb = np.sqrt(np.power(r,2)-np.power((a-x),2))plt.plot(a,y+b,color=c,linestyle='-')plt.plot(a,y-b,color=c,linestyle='-')plt.scatter(x, y, c='r',marker='*')if __name__ == '__main__':data = pd.read_csv(r'C:/Users/潘登/Documents/python全系列/人工智能/iris.csv')X = np.array(data.iloc[:, 2:4])Y = data['species']result = Solution().Canopy(X, 2, 1)x1 = []y1 = []for i in result[0]:x1.append(i[0])y1.append(i[1])x2 = []y2 = []for i in result[1]:x2.append(i[0])y2.append(i[1])x3 = []y3 = []for i in result[2]:x3.append(i[0])y3.append(i[1])plt.figure(figsize=(16,12))plt.scatter(X[:,0], X[:,1], s=50, c='violet', marker='s')plt.scatter(x1, y1, s=50, c='orange', marker='s')plt.scatter(x2, y2, s=50, c='lightblue', marker='s')plt.scatter(x3, y3, s=50, c='blue', marker='s')pint(2, x1[0], y1[0], 'b')pint(1, x1[0], y1[0], 'y')pint(2, x2[0], y2[0], 'b')pint(1, x2[0], y2[0], 'y')pint(2, x3[0], y3[0], 'b')pint(1, x3[0], y3[0], 'y')plt.xlim([0, 8])plt.ylim([-3, 5])plt.show()

+结果如下:

相关文章:

  • Postman(注册,使用,作用)【详解】
  • 通过Electron打包前端项目为exe
  • 贪心算法详解与任务调度问题Demo
  • 【数据结构】单链表的层层实现!! !
  • Tomcat的安装
  • GB/T 35751-2017 汽车装饰用非织造布及复合非织造布检测
  • linux系统docker历史以及对虚拟机的区别
  • 基于SSM的党务政务服务热线平台(有报告)。Javaee项目。ssm项目。
  • 02-gitlab的数据备份和恢复
  • R语言 | 复数 相关函数
  • 已解决com.alibaba.com.caucho.hessian.io.HessianProtocolException异常的正确解决方法,亲测有效!!!
  • 使用awk和正则表达式过滤文本或字符串 - 详细指南和示例
  • 深入理解锁的升级与降级
  • 错误与异常之为何要异常
  • Dockerfile的使用,怎样制作镜像
  • JavaScript-如何实现克隆(clone)函数
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 0基础学习移动端适配
  • 30秒的PHP代码片段(1)数组 - Array
  • Angular2开发踩坑系列-生产环境编译
  • angular2开源库收集
  • CAP 一致性协议及应用解析
  • fetch 从初识到应用
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript DOM 10 - 滚动
  • JavaScript 奇技淫巧
  • JavaScript的使用你知道几种?(上)
  • js ES6 求数组的交集,并集,还有差集
  • MySQL数据库运维之数据恢复
  • node入门
  • Objective-C 中关联引用的概念
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React as a UI Runtime(五、列表)
  • Vue UI框架库开发介绍
  • vue中实现单选
  • 阿里研究院入选中国企业智库系统影响力榜
  • 关于 Cirru Editor 存储格式
  • 后端_MYSQL
  • 如何优雅地使用 Sublime Text
  • 实现简单的正则表达式引擎
  • 责任链模式的两种实现
  • UI设计初学者应该如何入门?
  • # 计算机视觉入门
  • $().each和$.each的区别
  • (C语言)球球大作战
  • (多级缓存)缓存同步
  • (已解决)什么是vue导航守卫
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (轉)JSON.stringify 语法实例讲解
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .NET Core中Emit的使用
  • .NET DataGridView数据绑定说明
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net 生成二级域名