文章目录

  • 前言
  • KMeans流程
  • 距离公式
  • 代码
  • 运行效果
  • 可能存在问题
    • 猜想
    • 分析

前言

废话不多说,咱们开始吧,看牛皮的标题应该就知道我想干什么了,嘿嘿~

在开始之前咧,我们先来简单的来看看咱们的Kmeans,这样我们就能够知道我们今天的玩意能够干嘛了。

KMeans流程

这个算法咧,其实我以前玩过,不过当时是使用sklearn直接调包的。那么今天呢,我们就先来简单复习。

KMeans 就分几步嘛。

  1. 随机选择中心点
  2. 计算每一个点离中心点的位置,选择最近的一个点(如果这个点理两个以上的中心的距离一样,那么无法分类)
  3. 根据每一个分类的点,重新计算中心,然后再次让所有的点去计算距离(中心点移动了,点要重新划分)
  4. 等到中心点不在移动后,我们停止算法

距离公式

由于咱们是使用距离的,所以这里我们有好几个距离公式可以选择(我这里复现是直接使用欧式距离的)



dist = |x1−x2|+|y1−y2|

这几个距离公式无所谓,到时候其实把代码改一下就好了。

代码

ok,现在我们直接来看看我们的代码。

我们的复现是做一个四分类的,四个颜色对应不同分类,还有一个分类是说那个点无法被那四个类分出来。
因为我们我们是分类属于那个类别是看你这个点距离那个中心点的距离来的,离得最近的中心的假设是A,那么此时这个点就是属于A的,但是如果最近的点有两个A,B的话,那么这个点是无法分类的。

import numpy as np
import  math
import matplotlib.pyplot as plt
import random
#我们设计一个四分类的玩意儿,是一个二维的,因为二维的图像好画
K = 4
ECPHO = 300
Classfiy = ['red','blue','green','black']
OverClass =['cyan']
NUMBERS = 200
DIM = 2
SIZEPoint=(NUMBERS+int(NUMBERS),DIM)
MinRange = 1
MaxRange = 10
FRESH = 10
FRESHTIME = 1/FRESH
BUFFERTIME = 1plt.ion()def CreateData(k):#返回初始化的点和随机选取的中心点dataset = np.array([random.sample(range(MinRange,MaxRange),2) for _ in range(NUMBERS)])# dataset = np.random.rand(400).reshape(200,2)*10centers_init = np.random.choice(np.arange(len(dataset)),k,replace=False)return dataset,dataset[centers_init]def CompareDist(point,centers)->int:#距离计算#center:[[x1,y1],[x2,y2]]#返回当前点理哪一个中心点最近x,y = point[0],point[1]dist = []for center in centers:dis = math.sqrt(math.pow(x-center[0],2)+math.pow(y-center[1],2))dist.append(dis)if(dist.count(min(dist)))>1:return Kelse:return dist.index(min(dist))def CompareClassfiy(dataset,centers):#这个函数的作用很简单,计算每一个点到中心的距离,然后分类#分完类之后,我们再重新计算新的centers#并且返回当前新的中心和原来的中心的差值,以及当前分好类的点,以及无法分类的玩意ClassPoints = {'red':[],'blue':[],'green':[],'black':[]}OverPoints = {'cyan':[]}for point in dataset:classfiy = CompareDist(point,centers)if(classfiy<K):ClassPoints[Classfiy[classfiy]].append(point)else:OverPoints[OverClass[0]].append(point)newCenters = []for key in ClassPoints.keys():temp = np.array(ClassPoints.get(key))newcenter = np.average(temp,axis=0).tolist()newCenters.append(newcenter)newCenters = np.array(newCenters)changed = newCenters - centersreturn newCenters,changed,ClassPoints,OverPointsdef show(ClassPoints:dict,Centers,OverPoints):for index in range(len(Centers)):#绘制中心点plt.scatter(Centers[index][0],Centers[index][1],marker='o',color=Classfiy[index],s=150)#绘制所属类别的点Points = ClassPoints.get(Classfiy[index])Points=np.array(Points)sca = plt.plot(Points[:,0],Points[:,1],'--',color =Classfiy[index] )Over = OverPoints.get(OverClass[0])if(len(Over)>0):Over = np.array(Over)sca = plt.plot(Over[:, 0], Over[:, 1],'*',color=OverClass[0],marker="X")plt.show()def KMeans(K):# 初始化参数dataSet,centers = CreateData(K)newCenters,changed,ClassPoints,OverPoints = CompareClassfiy(dataSet,centers)show(ClassPoints,centers,OverPoints)bufferTime = 0for i in range(ECPHO):centers = newCentersnewCenters,changed,ClassPoints,OverPoints = CompareClassfiy(dataSet,centers)show(ClassPoints,centers,OverPoints)plt.pause(FRESHTIME)plt.cla()if(changed.all()==0.):bufferTime+=1if(bufferTime>=BUFFERTIME):breakplt.ioff()show(ClassPoints,centers,OverPoints)if __name__ == '__main__':KMeans(K)

运行效果

看代码还是比较简单的
我们来看看运行图

这里我为了好看出边界,所以我是使用虚线连接了点,因为接下来有个问题是我们要解决的。
(下图是用点表示的,边界不好看)

可能存在问题

ok ,我们先来看看我们的一个结果

湛蓝色的点是我们无法分类的点。如果我们采用我们的距离来计算的话,那么你会发现有些点我们是压根没有办法分类的。
所以问题来了,如果我就想要实现4分类,我要求你必须要给我分个类,必须分配到所有的点,那么你如何搞。
那么在这里我的答案是使用神经网络

猜想

提出基于距离的分类的目的是期望能够找到—种基于距离的隐藏关系然后实现分类,但是有时候有些关系可能是很距离相关但不是强相关,所有可能导致部分点无法分类的问题。于是提出两个遐想。1.能否利用神经网络代替传统距离公式,利用神经网络学习隐藏关系得出—种能够特殊的隐藏关系的期望进行分类。2.能否直接利用神经网络分类,在学习距离的同时希望神经网络可以学习到与距离相关但是非强的隐藏关系。

分析

这里我分别对两个设想进行实现。—个是关于距离的,—个是关于分类的。并且在设计的时候,对第一个遐想参考DQN网络进行设计,得到结果收敛性和分类效果极差。对第二个遐想进行实现,分析了参考DQN设计的问题,采用GAN网络进行设计,提出基于距离的GANKmeans聚类算法,提出复合算法机制,我们设计了两个简单的三层神经网络使用RULE作为激活函数作为生成器和判断器,期望能够利用神经网络在学习到距离关系期望的同时还能够学习到与距离有关但非强相关的关系,从而对所有点都可以实现分类。

Kmeans算法实现相关推荐

  1. 机器学习中的聚类算法(1):k-means算法

    一文详解激光点云的物体聚类:https://mp.weixin.qq.com/s/FmMJn2qjtylUMRGrD5telw 引言: Q:什么是聚类算法? 现在我们在做的深度学习当中,比如图像的识别 ...

  2. python实现K-means算法

    K-means算法流程: 随机选k个样本作为初始聚类中心 计算数据集中每个样本到k个聚类中心距离,并将其分配到距离最小的聚类中心 对于每个聚类,重新计算中心 回到2,至得到局部最优解 python代码 ...

  3. Python之机器学习K-means算法实现

    一.前言: 今天在宿舍弄了一个下午的代码,总算还好,把这个东西算是熟悉了,还不算是力竭,只算是知道了怎么回事.今天就给大家分享一下我的代码.代码可以运行,运行的Python环境是Python3.6以上 ...

  4. matlab 职坐标,机器学习入门之机器学习实战ByMatlab(四)二分K-means算法

    本文主要向大家介绍了机器学习入门之机器学习实战ByMatlab(四)二分K-means算法,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助.前面我们在是实现K-means算法的时候,提到 ...

  5. 一文详尽系列之K-means算法

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 K-means 是我们最常用的基于距离的聚类算法,其认为两个目标的距离越近,相似度越大 ...

  6. 标准K-means算法的缺陷、K-mean++初始化算法、初始化算法步骤、Kmeans++算法实现

    标准K-means算法的缺陷.K-mean++初始化算法.初始化算法步骤.Kmeans++算法实现 目录 标准K-means算法的缺陷.K-mean&

  7. Kmeans算法的过程是什么?Kmeans算法的缺陷主要有哪些?

    Kmeans算法的过程是什么?Kmeans算法的缺陷主要有哪些? 目录 Kmeans算法的过程是什么?Kmeans算法的缺陷主要有哪些?

  8. AI K-means算法对数据进行聚类分析-实验报告

    1. 问题描述及实验要求 K-means算法对data中数据进行聚类分析 (1)算法原理描述 (2)算法结构 (3)写出K-means具体功能函数(不能直接调用sklearn.cluster(Mean ...

  9. 「AI科技」机器学习算法之K-means算法原理及缺点改进思路

    https://www.toutiao.com/a6641916717624721933/ 2019-01-03 08:00:00 K-means算法是使用得最为广泛的一个算法,本文将介绍K-mean ...

  10. 机器学习里如何确定K-Means算法的K值?

    [问题] Kmeans算法中,K值所决定的是在该聚类算法中,所要分配聚类的簇的多少.Kmeans算法对初始值是比较敏感的,对于同样的k值,选取的点不同,会影响算法的聚类效果和迭代的次数. [解决方案] ...

最新文章

  1. webpack项目中使用vue
  2. mysql中判断字段为空
  3. 【Tensorflow】io 操作
  4. 基于operator sdk编写一个k8s自定义资源管理应用
  5. docker实现宿主机和容器之间数据共享
  6. 【NOI2012】骑行川藏【拉格朗日乘数法】【二分套二分】
  7. 电容的q值计算公式_在设计电路中电容容量大小、耐压等级选取详解 (转)
  8. 计算机在材料科学中的应用上机二,计算机在材料科学中的应用-上机实验二.doc...
  9. 关于scanf 函数,你很少了解的“秘密”
  10. 多视几何_计算一副图像上的点在另一福图像上的对应点
  11. 无法实现的梦想:孤独之旅计划
  12. TortoiseGit乌龟git添加公钥密钥和私钥认证,实现乌龟git同步免密码输入
  13. Linux开发之libaio源码分析及应用
  14. 电路交换、报文交换、分组交换的特点和比较
  15. 神州数码c语言笔试题,神州数码软件测试工程师笔试C语言题目详解
  16. 业务逻辑这个是什么东东
  17. Android 11 正式发布:更方便的操作和更安全的隐私
  18. 用nodejs写一个yys挂机脚本
  19. python什么字体好看_七个不一样的Python代码写法,让你写出一手漂亮的代码
  20. 提升网站关键词排名的技巧

热门文章

  1. ong拼音汉字_汉语拼音ang-ong(教案)
  2. Teamviewer远程工具使用
  3. NAT穿透原理(转载)
  4. MacOS Mojave 安装 AI 東北きりたん 东北切蒲英 NEUTRINO 教程
  5. Eplan教程——项目检查错误 005013/005014:连接点类型不同
  6. 内蒙古自治区及其盟市行政单位中英文名称对照表
  7. 业务系统+电子签章开放平台,快速构建个性化的电子签署应用
  8. 抖音网红怎么赚钱了?通过一百行代码批量下载抖音视频!找到窍门!
  9. CSS(三)盒子模型
  10. 局域网共享文件夹加密(100%成功版本)