在无监督学习中,我们首先就会接触到kmeans算法,因为既简单,又实用,而且速度也很快。所以今天在这里写一个非常简单的kmeans算法,以帮助我们更快的领悟算法的思想,以及它的变种。一下是其实现步骤

  1. 确定聚类数,数据分为多少类。
  2. 随机初始化每一类的中心点。
  3. 计算每一个样本点到每一类中心点的距离,并分配给距离它最小的那个中心点。
  4. 更新中心点,新的中心点为属于它所有点的平均值。
  5. 重复3,4操作,即可完成。

数据不是太漂亮,实现的效果也不是特别好,代码写的很简单,还有优化的空间。

from sklearn.datasets import load_iris
import numpy as np
import matplotlib.pyplot as plta,b = load_iris(return_X_y=True)x = a[:,:2]   #便于绘图center_1 = np.array([5,3.5])   #初始化中心点
center_2 = np.array([6,2])
center_3 = np.array([7,3])for k in range(200):center_list1 = []center_list2 = []center_list3 = []for i in x:a = ((i[0] - center_1[0])*(i[1]-center_1[1]))**2b = ((i[0] - center_2[0])*(i[1]-center_2[1]))**2c = ((i[0] - center_3[0])*(i[1]-center_3[1]))**2if a<b and a<c :center_list1.append(i)elif b<c:center_list2.append(i)elif c<b :center_list3.append(i)new_1_x =  0new_1_y = 0for a in center_list1:new_1_x +=a[0]new_1_y +=a[1]center_1[0] = new_1_x / (len(center_list1))center_1[1] = new_1_y / (len(center_list1))new_1_x = 0new_1_y = 0for a in center_list2:new_1_x += a[0]new_1_y += a[1]print(len(center_list3))center_2[0] = new_1_x / (len(center_list2))center_2[1] = new_1_y / (len(center_list2))new_1_x = 0new_1_y = 0for a in center_list3:new_1_x += a[0]new_1_y += a[1]center_3[0] = new_1_x / (len(center_list3))center_3[1] = new_1_y / (len(center_list3))plt.scatter([x[0] for x in center_list1],[x[1] for x in center_list1],c='red')
plt.scatter([x[0] for x in center_list2],[x[1] for x in center_list2],c='green')
plt.scatter([x[0] for x in center_list3],[x[1] for x in center_list3],c='blue')
plt.scatter(center_1[0],center_1[1],c='black')
plt.scatter(center_2[0],center_2[1],c = 'black')
plt.scatter(center_3[0],center_3[1],c='black')
plt.show()

下面的这个代码是一个优化的版本,参考于https://www.cnblogs.com/zxzhu/p/7994612.html,
该博客主写的方法也太简单的,便于阅读,很适合学习。

 123456 from sklearn.datasets import make_blobs7 import numpy as np8 import matplotlib.pyplot as plt9
10
11 def Distance(x):
12     def Dis(y):
13         return np.sqrt(sum((x-y)**2))                      #欧式距离
14     return Dis
15
16 def init_k_means(k):
17     k_means = {}
18     for i in range(k):
19         k_means[i] = []
20     return k_means
21
22 def cal_seed(k_mean):                                      #重新计算种子点
23     k_mean = np.array(k_mean)
24     new_seed = np.mean(k_mean,axis=0)                      #各维度均值
25     return new_seed
26
27 def K_means(data,seed_k,k_means):
28     for i in data:
29         f = Distance(i)
30         dis = list(map(f,seed_k))                 #某一点距所有中心点的距离
31         index = dis.index(min(dis))
32         k_means[index].append(i)
33
34     new_seed = []                                         #新的样本中心点
35     for i in range(len(seed_k)):
36         new_seed.append(cal_seed(k_means[i]))
37     new_seed = np.array(new_seed)
38     return k_means,new_seed
39
40 def run_K_means(data,k):
41     seed_k = data[np.random.randint(len(data),size=k)]    #随机产生样本中心点
42     k_means = init_k_means(k)                             #初始化每一类
43     result = K_means(data,seed_k,k_means)
44     count = 0
45     while not (result[1] == seed_k).all():            #种子点改变,继续聚类
46         count+=1
47         seed_k = result[1]
48         k_means = init_k_means(k=7)
49         result = K_means(data,seed_k,k_means)
50     print('Done')
51     #print(result[1])
52     print(count)
53     plt.figure(figsize=(8,8))
54     Color = 'rbgyckm'
55     for i in range(k):
56         mydata = np.array(result[0][i])
57         plt.scatter(mydata[:,0],mydata[:,1],color = Color[i])
58     return result[0]
59 x,y = make_blobs(n_features=3,n_samples=1000,random_state=21)
60
61 run_K_means(data,k=3)

程序中那个闭包的操作需要我们多去捋一捋。

在聚类中使用的较多的一种聚类是基于密度的DBSCAN算法,该算法不需要指定类别数,但是要指定半径大小以及该范围内包含点的最小数目。

DBSCAN算法描述:输入:
输入: 包含n个对象的数据库,半径e,最少数目MinPts;
输出:所有生成的簇,达到密度要求。
(1)Repeat
(2)从数据库中抽出一个未处理的点;
(3)IF抽出的点是核心点 THEN 找出所有从该点密度可达的对象,形成一个簇;
(4)ELSE 抽出的点是边缘点(非核心对象),跳出本次循环,寻找下一个点;
(5)UNTIL 所有的点都被处理。
DBSCAN对用户定义的参数很敏感,细微的不同都可能导致差别很大的结果,而参数的选择无规律可循,只能靠经验确定。

  1. 与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。
  2. 与K-means方法相比,DBSCAN可以发现任意形状的簇类。
  3. 同时,DBSCAN能够识别出噪声点。
    4.DBSCAN对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大。但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而>其归属有所摆动。

具体的实现如下,过程很简单,细读后,复现应该是没有问题的,我也是从
https://www.cnblogs.com/tiaozistudy/p/dbscan_algorithm.html,里面学来的,代码基本一样,他里面有跟详细的介绍。

import math
import numpy as np
from sklearn.datasets import make_circles
import random
import matplotlib.pyplot as pltclass visited:
'''记录那些点是被标记了的,那些点是没有被标记的,以及没有被标记点的个数  , 记录的是每个点在data里面的位置,也就是index
'''def __init__(self,count=0):self.visitedlist = list()self.unvisitedlist = [i for i in range(count]self.unvisitednum = countdef visvit(self,opints):self.visitedlist.append(opints)self.unvisitedlist.remove(opints)self.unvisitednum -= 1#计算距离
def dist(x , y):return math.sqrt(np.power(x-y,2).sum())def DBSCAN(data,eps,minpts):count = data.shape[0]visit = visited(count)k = -1   #表示类别C = [-1 for i in range(count]while (visit.unvisitednum > 0 ):p = random.choice(visit.unvisitedlist)   visit.visvit(p)N = [i for i in visit.unvisitedlist if dist(data[i],data[p]) <= eps]if len(N) >= minpts:k += 1C[p] = kfor p1 in N:visit.visvit(p1)M = [i for i in visit.unvisitedlist if dist(data[i],data[p]) <= eps]if len(M) >=minpts:for i in M:if i not in N:N.append(i)C[p1] = kelse:C[p] = -1return Cx ,y = make_circles(n_samples=2000,factor=0.6,noise=0.05,random_state=1)a = DBSCAN(x,0.1,10)
plt.figure(figsize=(12,9))
plt.scatter(x[:,0],x[:,1],c = a)
plt.show()

上面讲述了两种常用的聚类方法,里面的DBSCAN还可以用KD树来优化,这里就不讲述了,(我也不会)。聚类方法也还挺简单的,没有那些复杂的数学公式推导,相信你们也和我一样,看到公式就头疼。聚类的算法重点还是其思想,理解了它的思想,那么你也就成功了65%。

聚类kmeans和DBSCAN算法的简单实现相关推荐

  1. 聚类方法:DBSCAN算法研究

    DBSCAN聚类算法三部分: 1.        DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...

  2. 聚类方法:DBSCAN算法研究(1)--DBSCAN原理、流程、参数设置、优缺点以及算法

    DBSCAN聚类算法三部分: 1.        DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...

  3. 聚类方法:DBSCAN算法研究(2)--matlab代码实现

    DBSCAN聚类算法三部分: 1.        DBSCAN原理.流程.参数设置.优缺点以及算法: http://blog.csdn.net/zhouxianen1987/article/detai ...

  4. EM算法应用:k均值聚类(k-means)和高斯混合模型(GMM)

    文章目录 k-means聚类 EM角度的理解 算法流程 特点 k值选择 局限性 高斯混合模型 GMM的问题描述 1,明确隐变量 2.EM算法的E步:确定Q函数 3. EM算法的E步 4. 停止条件 上 ...

  5. Matlab实现DBSCAN算法(每行代码标注详细注解)

    本文主要为了完成平日作业,并进一步加深对算法的理解.也希望对来访的读者有所帮助. 目录 一.什么是DBSCAN算法 二.DBSCAN算法的意义 三.DBSCAN算法代码解析 1.关键概念 2.大致思路 ...

  6. DBSCAN算法原理分析

    DBSCAN算法原理: 定义:基于密度的带有噪声的空间聚类,可用于异常值监测,通俗来说就是基于密度的聚类算法! 簇的定义:簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并且可以在 ...

  7. Udacity机器人软件工程师课程笔记(二十一) - 对点云进行集群可视化 - 聚类的分割 - K-means|K均值聚类, DBSCAN算法

    聚类的分割 1.K-均值聚类 (1)K-均值聚类介绍 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心 ...

  8. python 三种聚类算法(K-means,AGNES,DBScan)

    python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan) 更新时间:2019年06月27日 14:44:44   作者:weixin_42134141 这篇文章主要介绍了pyth ...

  9. kmeans鸢尾花分类python代码_python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

    一.分散性聚类(kmeans) 算法流程: 1.选择聚类的个数k. 2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心. 3.对每个点确定其聚类中心点. 4.再计算其聚类新中心. 5.重复以 ...

最新文章

  1. COMET | 概念学习使机器具有人的思维方式
  2. 首个波士顿动力机器狗买家秀来了:化身监工,确认路线后就能自动巡航
  3. 1731: 数棍子(二分,最后一个大于等于)
  4. IBASE deletion timestamp verification
  5. 办公技巧:Excel教程36个逆天功能,全面了解一下!
  6. 切换表达式到Java吗?
  7. 洛谷 2719 搞笑世界杯
  8. .view-content:overflow:hidden 大错误
  9. day15【前台】项目发布
  10. 品味ZooKeeper之Watcher机制_2
  11. [Jobdu] 题目1037:Powerful Calculator
  12. Python:第六次全国人口普查数据分析及可视化(pandas、matplotlib)
  13. 19、SPI 和 SST25VF016B
  14. 【VS插件】VS2012设置透明背景
  15. 天涯python_用python做了个简易的天涯脱水功能
  16. 1980-2010的87个国家/地区的一些经济和金融发展指标简单归纳和解释以及如何套动态面板公式计算
  17. 白话大数据与机器学习——阅读笔记
  18. Mac自带apache2搭建服务请求localhost报 403 Forbidden
  19. 今日恐慌与贪婪指数为21 恐慌程度有所缓解
  20. Python实现计算器四则运算小程序

热门文章

  1. 爬动的蠕虫(无循环版)
  2. 智能车入门——元素识别与循迹
  3. 用词袋(bag of word)实现场景识别
  4. Java包的创建和使用
  5. 读计算机成都哪所学校好,成都哪所计算机学校好
  6. Excel VBA 合并单元格适应分页打印
  7. 链接:https://pan.baidu.com/s/1joRvLQ7nbti0Wp4t2CkX5w 提取码:ZMTD
  8. UE4 材质学习 (焚烧材质)
  9. “七彩”糖果-吕中琪
  10. keyberos认证问题导致GSS initiate failed