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

一.分散性聚类(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()

运行结果:

201906271434285.png

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

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()

运行结果:

201906271434286.png

三.密度聚类之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()

运行结果:

201906271434287.png

改变参数后:

201906271434288.png

四、结果分析

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

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

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

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

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

本文地址: http://www.cppcns.com/jiaoben/python/263818.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

akka_Akka的字数统计MapReduce

akka在我与Akka的日常工作中,我最近写了一个字数映射减少示例。 本示例实现了Map Reduce模型,该模型非常适合横向扩展设计方法。 流 客户端系统(FileReadActor)读取文本文件,并将每一行文本作为消息发送给ClientActor…

Log4j 2配置与IntelliJ IDEA控制台颜色

Log4j是Java平台上最好的日志组件了&#xff0c;Log4j 2升级了不少API&#xff0c;拓展性更好。使用的话只需要直接引入就可以了. <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> &…

用c3p0连接oracle怎么分页,JSP分页(MySql+c3p0+dbutils)

JSP分页(MySqlc3p0dbutils)来源&#xff1a;互联网作者&#xff1a;佚名时间&#xff1a;2015-02-16 17:27为什么要对数据进行分页&#xff1f;当数据较多时&#xff0c;页面就会变的很庞大&#xff0c;不仅会影响到用户的使用&#xff0c;而且还有加重服务器的负担。下面简单的…

用python自动发邮件_Python实现向QQ群成员自动发邮件的方法

#coding:utf-8 import random import smtplib from email.mime.text import MIMEText import time def send_mail(mailto): print Setting MIMEText CTopen(content.txt,r) #读取发送邮件内容 contentCT.read().decode(utf-8) msgMIMEText(content.encode(utf8),_subtypehtml) …

Apache Storm的实时情绪分析示例

实时情感分析是指处理自然语言文本&#xff08;或语音&#xff09;流以提取主观信息。 琐碎的用例用于构建推荐引擎或查找社交媒体趋势。 我选择了Apache Storm作为实时处理引擎。 Storm非常强大&#xff08;我们正在生产中使用它&#xff09;&#xff0c;并且非常容易在其之上…

产品经理在早期如何快速学习?

产品经理在早期如何快速学习&#xff1f; 1、多阅读 &#xff08;1&#xff09;阅读专业书籍 比如说小米的黎万强写了一本《参与感》&#xff0c;讲述了小米成长过程中的一系列案例分析&#xff0c;概念总结。黎老师是小米创始元老&#xff0c;案例有小米的成功背书&#xff0c…

linux ftp解压命令 cannot fid or open,Linux环境搭建及常用shell命令集锦

22.crontab –l 查看crontab命令行 (13)23.重定向 (13)24.ps –eaf | grep httpd 查找httpd进程 (13)25.kill -9 PID 强制停止进程 (13)26.rpm –ivh a.rpm 安装rpm包 (13)27.chmod 111(可执行)/222(可读)/444(可写) file 权限 (13)28.修改linux颜色在vim .bash_profile里添加e…

flink sql设置并行度_《从0到1学习Flink》—— Flink parallelism 和 Slot 介绍

前言之所以写这个是因为前段时间自己的项目出现过这样的一个问题&#xff1a;Caused by: akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://flink/user/taskmanager_0#15608456]] after [10000 ms]. Sender[null] sent message of type "org.apache.f…

zabbix3.2监控

自动化运维框架 运维标准流程监控管理容量管理、关联关系、任务管理、自动部署、分布式集群、传统集群、机器管理安全控制灾难管理 自动化监控 监控评估数据采集主动式数据采集: client、公共插件、自定义脚本被动式服务状态: 服务状态、程序状态、用户访问质量第三方信息 公…

linux使用创建es用户,linux用户权限设置(安装elasticsearch7.x)

前言今天下载了elasticsearch的7.x版本&#xff0c;使用bin/elasticsearch -d 启动后&#xff0c;报出如下错误&#xff1a;java.lang.RuntimeException: can not run elasticsearch as rootat org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:105)at…

fasttext 文本分类_一文综述经典的深度文本分类方法

作者 | 何从庆转载自AI算法之心(ID:AIHeartForYou)笔者整理最近几年比较经典的深度文本分类方法&#xff0c;希望帮助小伙伴们了解深度学习在文本分类中的应用。Convolutional Neural Networks for Sentence Classification (EMNLP 2014)Kim在EMNLP2014提出的TextCNN方法&…

Java 8 Streams API:对流进行分组和分区

这篇文章展示了如何使用Streams API中可用的Collectors将具有groupingBy的流元素和具有partitioningBy的流元素进行groupingBy 。 考虑一系列Employee对象&#xff0c;每个对象都有名称&#xff0c;城市和销售数量&#xff0c;如下表所示&#xff1a; ----------------------…

vi/vim 编辑器详解

vi/vim &#xff1a; 强大的编辑器 进入vi的命令 vi filename :打开或新建文件&#xff0c;并将光标置于第一行首 vi n filename &#xff1a;打开文件&#xff0c;并将光标置于第n行首 vi filename &#xff1a;打开文件&#xff0c;并将光标置于最后一行首 vi /pattern …

linux 定义快捷命令,Linux系统自定义快捷命令的详细说明

Linux系统用户可以自定义喜欢的快捷键命令。下面由学习啦小编为大家整理了Linux系统自定义快捷键命令的详细说明&#xff0c;希望对大家有帮助!Linux系统自定义快捷命令的详细说明目前总结到的有两种方式&#xff0c;一种是临时快捷键&#xff0c;一种是永久快捷键。Linux系统自…

python求最小公倍数_python求最大公约数和最小公倍数的简单方法

python怎么求最大公约数和最小公倍数 一、求最大公约数 用辗转相除法求最大公约数的算法如下&#xff1a; 两个正整数a和b&#xff08;a>b&#xff09;&#xff0c;它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25&#xff0c;25除以10商2余5&#xff0c…

linux如何获取raw中的文件路径,如何使用Linux获取Touchscreen Rawdata的坐标

我们有一个3米的微触摸显示屏.它通过usb连接到我的debian系统,并被识别为人机界面(hid).我正在尝试访问并推送实时信息…如果它被触及我想知道哪里(x,y)并通过netcat管道到另一台主机.不幸的是,我只能使用原始数据cat /dev/input/event2 | hexdump要么evtest你得到的hexcode似乎…

实验三+067+冯艳芳

一、实验目的 掌握黑盒测试用例设计方法 二、实验要求 &#xff08;1&#xff09;对被测程序进行黑盒测试用例设计 &#xff08;2&#xff09;运用等价类、边界值、决策表、状态图法等进行测试用例设计。 &#xff08;3&#xff09;对手机上任意一款音乐软件进行黑盒测试实践。…

python越来越慢_为什么Python中的串联速度越来越慢?

为什么在某些情况下,Python 3中的连接似乎比Python 2中的连接慢&#xff1f; 影响最大的串联方法似乎是字节对象的连续串联,从O(n)到O(n?)操作. 我的分析代码大部分在这里&#xff1a; #!/usr/bin/env python from operator import concat from sys import version, version_i…

jvm gc策略_IBM JVM调整– gencon GC策略

jvm gc策略本文将向您详细介绍从Java虚拟机&#xff08;例如HotSpot或JRockit&#xff09;迁移到IBM JVM时重要的Java堆空间调整注意事项。 此调整建议基于我为我的一个IT客户端执行的最新故障排除和调整任务。 IBM JVM概述 正如您可能从其他文章中看到的那样&#xff0c;IBM …

linux etc 服务启动脚本,linux 服务脚本启动问题

对于使用了 systemd 的系统&#xff0c;所有的 service 服务都会默认转为 systemd 服务之后再由 systemd 来执行&#xff0c;转换之后&#xff0c;你也可以直接使用 systemd 来执行了(它的用户工具就是你用的 systemctl)&#xff0c;除非是一些非 service 标准的命令&#xff0…