python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)


Posted in Python onJune 27, 2019

一.分散性聚类(kmeans)

算法流程:

1.选择聚类的个数k.

2.任意产生k个聚类,然后确定聚类中心,或者直接生成k个中心。

3.对每个点确定其聚类中心点。

4.再计算其聚类新中心。

5.重复以上步骤直到满足收敛要求。(通常就是确定的中心点不再改变。

优点:

1.是解决聚类问题的一种经典算法,简单、快速

2.对处理大数据集,该算法保持可伸缩性和高效率

3.当结果簇是密集的,它的效果较好

缺点

1.在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用

2.必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。

3.不适合于发现非凸形状的簇或者大小差别很大的簇

4.对躁声和孤立点数据敏感

这里为了看鸢尾花的三种聚类算法的直观区别,所以不用具体算法实现,只需要调用相应函数即可。

程序如下: 

import matplotlib.pyplot as plt 
import numpy as np 
from sklearn.cluster import KMeans
from sklearn import datasets 
 
iris = datasets.load_iris() 
X = iris.data[:, :4] # #表示我们取特征空间中的4个维度
print(X.shape)
 
# 绘制数据分布图
plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see') 
plt.xlabel('sepal length') 
plt.ylabel('sepal width') 
plt.legend(loc=2) 
plt.show() 
 
estimator = KMeans(n_clusters=3) # 构造聚类器
estimator.fit(X) # 聚类
label_pred = estimator.labels_ # 获取聚类标签
# 绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0') 
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1') 
plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2') 
plt.xlabel('sepal length') 
plt.ylabel('sepal width') 
plt.legend(loc=2) 
plt.show()

运行结果:

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

 二.结构性聚类(层次聚类)

1.凝聚层次聚类:AGNES算法(自底向上)

首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到某个终结条件被满足

2.分裂层次聚类:DIANA算法(自顶向下)

首先将所有对象置于一个簇中,然后逐渐细分为越来越小的簇,直到达到了某个终结条件。

这里我选择的AGNES算法。

程序如下:

from sklearn import datasets
from sklearn.cluster import AgglomerativeClustering
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import pandas as pd
 
iris = datasets.load_iris()
irisdata = iris.data
 
clustering = AgglomerativeClustering(linkage='ward', n_clusters=3)
 
res = clustering.fit(irisdata)
 
print ("各个簇的样本数目:")
print (pd.Series(clustering.labels_).value_counts())
print ("聚类结果:")
print (confusion_matrix(iris.target, clustering.labels_))
 
plt.figure()
d0 = irisdata[clustering.labels_ == 0]
plt.plot(d0[:, 0], d0[:, 1], 'r.')
d1 = irisdata[clustering.labels_ == 1]
plt.plot(d1[:, 0], d1[:, 1], 'go')
d2 = irisdata[clustering.labels_ == 2]
plt.plot(d2[:, 0], d2[:, 1], 'b*')
plt.xlabel("Sepal.Length")
plt.ylabel("Sepal.Width")
plt.title("AGNES Clustering")
plt.show()

运行结果:

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

三.密度聚类之DBSCAN算法:

算法:

需要两个参数:ε (eps) 和形成高密度区域所需要的最少点数 (minPts)

它由一个任意未被访问的点开始,然后探索这个点的 ε-邻域,如果 ε-邻域里有足够的点,则建立一个新的聚类,否则这个点被标签为杂音。注意这个点之后可能被发现在其它点的 ε-邻域里,而该 ε-邻域可能有足够的点,届时这个点会被加入该聚类中。

程序如下:

import matplotlib.pyplot as plt 
import numpy as np 
from sklearn.cluster import KMeans
from sklearn import datasets 
from sklearn.cluster import DBSCAN
 
iris = datasets.load_iris() 
X = iris.data[:, :4] # #表示我们只取特征空间中的4个维度
print(X.shape)
# 绘制数据分布图
plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='see') 
plt.xlabel('sepal length') 
plt.ylabel('sepal width') 
plt.legend(loc=2) 
plt.show() 
 
dbscan = DBSCAN(eps=0.4, min_samples=9)
dbscan.fit(X) 
label_pred = dbscan.labels_
 
# 绘制k-means结果
x0 = X[label_pred == 0]
x1 = X[label_pred == 1]
x2 = X[label_pred == 2]
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0') 
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1') 
plt.scatter(x2[:, 0], x2[:, 1], c="blue", marker='+', label='label2') 
plt.xlabel('sepal length') 
plt.ylabel('sepal width') 
plt.legend(loc=2) 
plt.show()

运行结果:

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

改变参数后:

python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

四、结果分析

从上面三种实验截图可以看出,k-means聚类和AGNES层次聚类分析结果差不多的三类,与DBSCAN的结果不一样。为啥不一样,这就取决于算法本身的优缺点了。

k-means对于大型数据集也是简单高效、时间复杂度、空间复杂度低。 最重要是数据集大时结果容易局部最优;需要预先设定K值,对最先的K个点选取很敏感;对噪声和离群值非常敏感;只用于numerical类型数据;不能解决非凸数据。

 DBSCAN对噪声不敏感;能发现任意形状的聚类。 但是聚类的结果与参数有很大的关系;DBSCAN用固定参数识别聚类,但当聚类的稀疏程度不同时,相同的判定标准可能会破坏聚类的自然结构,即较稀的聚类会被划分为多个类或密度较大且离得较近的类会被合并成一个聚类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用Tkinter显示网络图片的方法
Apr 24 Python
详解Python的Django框架中的通用视图
May 04 Python
简单解析Django框架中的表单验证
Jul 17 Python
浅谈Django学习migrate和makemigrations的差别
Jan 18 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
python中使用iterrows()对dataframe进行遍历的实例
Jun 09 Python
详解Appium+Python之生成html测试报告
Jan 04 Python
Python迭代器iterator生成器generator使用解析
Oct 24 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
Android Q之气泡弹窗的实现示例
Jun 23 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
Pandas中Series和DataFrame的索引实现
Jun 27 #Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 #Python
PyTorch的深度学习入门教程之构建神经网络
Jun 27 #Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 #Python
解决pycharm remote deployment 配置的问题
Jun 27 #Python
python turtle库画一个方格和圆实例
Jun 27 #Python
Python实现的对一个数进行因式分解操作示例
Jun 27 #Python
You might like
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
php中in_array函数用法探究
2014/11/25 PHP
php返回字符串中所有单词的方法
2015/03/09 PHP
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
仿中关村在线首页弹出式广告插件(jQuery版)
2012/05/03 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
从setTimeout看js函数执行过程
2017/12/19 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
微信小程序实现滚动加载更多的代码
2019/12/06 Javascript
基于node+websocket+html实现腾讯课堂聊天室聊天功能
2020/03/04 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
Django Admin实现上传图片校验功能
2016/03/06 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
Django实现组合搜索的方法示例
2018/01/23 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
Python文件读写w+和r+区别解析
2020/03/26 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
突破canvas语法限制 让他支持链式语法
2012/12/24 HTML / CSS
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
使用索引(Index)有哪些需要考虑的因素
2016/10/19 面试题
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
三月学雷锋月活动总结
2014/04/28 职场文书
R9700摩机记
2022/04/05 无线电
python字符串的一些常见实用操作
2022/04/06 Python