- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章K-means聚类算法介绍与利用python实现的代码示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
聚类 。
今天说K-means聚类算法,但是必须要先理解聚类和分类的区别,很多业务人员在日常分析时候不是很严谨,混为一谈,其实二者有本质的区别.
分类其实是从特定的数据中挖掘模式,作出判断的过程。比如Gmail邮箱里有垃圾邮件分类器,一开始的时候可能什么都不过滤,在日常使用过程中,我人工对于每一封邮件点选“垃圾”或“不是垃圾”,过一段时间,Gmail就体现出一定的智能,能够自动过滤掉一些垃圾邮件了。这是因为在点选的过程中,其实是给每一条邮件打了一个“标签”,这个标签只有两个值,要么是“垃圾”,要么“不是垃圾”,Gmail就会不断研究哪些特点的邮件是垃圾,哪些特点的不是垃圾,形成一些判别的模式,这样当一封信的邮件到来,就可以自动把邮件分到“垃圾”和“不是垃圾”这两个我们人工设定的分类的其中一个.
聚类的的目的也是把数据分类,但是事先我是不知道如何去分的,完全是算法自己来判断各条数据之间的相似性,相似的就放在一起。在聚类的结论出来之前,我完全不知道每一类有什么特点,一定要根据聚类的结果通过人的经验来分析,看看聚成的这一类大概有什么特点.
1、概述 。
k-means是一种非常常见的聚类算法,在处理聚类任务中经常使用。K-means算法是集简单和经典于一身的基于距离的聚类算法 。
采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.
该算法认为类簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标.
2、核心思想 。
通过迭代寻找k个类簇的一种划分方案,使得用这k个类簇的均值来代表相应各类样本时所得的总体误差最小.
k个聚类具有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开.
k-means算法的基础是最小误差平方和准则.
其代价函数是:
式中,μc(i)表示第i个聚类的均值.
各类簇内的样本越相似,其与该类均值间的误差平方越小,对所有类所得到的误差平方求和,即可验证分为k类时,各聚类是否是最优的.
上式的代价函数无法用解析的方法最小化,只能有迭代的方法.
3、算法步骤图解 。
下图展示了对n个样本点进行K-means聚类的效果,这里k取2.
4、算法实现步骤 。
k-means算法是将样本聚类成 k个簇(cluster),其中k是用户给定的,其求解过程非常直观简单,具体算法描述如下:
1)随机选取 k个聚类质心点 。
2)重复下面过程直到收敛 { 。
对于每一个样例 i,计算其应该属于的类:
对于每一个类 j,重新计算该类的质心:
} 。
其伪代码如下:
****************************************************************************** 。
创建k个点作为初始的质心点(随机选择) 。
当任意一个点的簇分配结果发生改变时 。
对数据集中的每一个数据点 。
对每一个质心 。
计算质心与数据点的距离 。
将数据点分配到距离最近的簇 。
对每一个簇,计算簇中所有点的均值,并将均值作为质心 。
******************************************************** 。
5、K-means聚类算法python实战 。
需求:
对给定的数据集进行聚类 。
本案例采用二维数据集,共80个样本,有4个类.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
#!/usr/bin/python
# coding=utf-8
from
numpy
import
*
# 加载数据
def
loadDataSet(fileName):
# 解析文件,按tab分割字段,得到一个浮点数字类型的矩阵
dataMat
=
[]
# 文件的最后一个字段是类别标签
fr
=
open
(fileName)
for
line
in
fr.readlines():
curLine
=
line.strip().split(
'\t'
)
fltLine
=
map
(
float
, curLine)
# 将每个元素转成float类型
dataMat.append(fltLine)
return
dataMat
# 计算欧几里得距离
def
distEclud(vecA, vecB):
return
sqrt(
sum
(power(vecA
-
vecB,
2
)))
# 求两个向量之间的距离
# 构建聚簇中心,取k个(此例中为4)随机质心
def
randCent(dataSet, k):
n
=
shape(dataSet)[
1
]
centroids
=
mat(zeros((k,n)))
# 每个质心有n个坐标值,总共要k个质心
for
j
in
range
(n):
minJ
=
min
(dataSet[:,j])
maxJ
=
max
(dataSet[:,j])
rangeJ
=
float
(maxJ
-
minJ)
centroids[:,j]
=
minJ
+
rangeJ
*
random.rand(k,
1
)
return
centroids
# k-means 聚类算法
def
kMeans(dataSet, k, distMeans
=
distEclud, createCent
=
randCent):
m
=
shape(dataSet)[
0
]
clusterAssment
=
mat(zeros((m,
2
)))
# 用于存放该样本属于哪类及质心距离
# clusterAssment第一列存放该数据所属的中心点,第二列是该数据到中心点的距离
centroids
=
createCent(dataSet, k)
clusterChanged
=
True
# 用来判断聚类是否已经收敛
while
clusterChanged:
clusterChanged
=
False
;
for
i
in
range
(m):
# 把每一个数据点划分到离它最近的中心点
minDist
=
inf; minIndex
=
-
1
;
for
j
in
range
(k):
distJI
=
distMeans(centroids[j,:], dataSet[i,:])
if
distJI < minDist:
minDist
=
distJI; minIndex
=
j
# 如果第i个数据点到第j个中心点更近,则将i归属为j
if
clusterAssment[i,
0
] !
=
minIndex: clusterChanged
=
True
;
# 如果分配发生变化,则需要继续迭代
clusterAssment[i,:]
=
minIndex,minDist
*
*
2
# 并将第i个数据点的分配情况存入字典
print
centroids
for
cent
in
range
(k):
# 重新计算中心点
ptsInClust
=
dataSet[nonzero(clusterAssment[:,
0
].A
=
=
cent)[
0
]]
# 去第一列等于cent的所有列
centroids[cent,:]
=
mean(ptsInClust, axis
=
0
)
# 算出这些数据的中心点
return
centroids, clusterAssment
# --------------------测试----------------------------------------------------
# 用测试数据及测试kmeans算法
datMat
=
mat(loadDataSet(
'testSet.txt'
))
myCentroids,clustAssing
=
kMeans(datMat,
4
)
print
myCentroids
print
clustAssing
|
运行结果:
6、K-means算法补充 。
K-means算法的缺点及改进方法 。
(1)k值的选择是用户指定的,不同的k得到的结果会有挺大的不同,如下图所示,左边是k=3的结果,这个就太稀疏了,蓝色的那个簇其实是可以再划分成两个簇的。而右图是k=5的结果,可以看到红色菱形和蓝色菱形这两个簇应该是可以合并成一个簇的:
改进:
对k的选择可以先用一些算法分析数据的分布,如重心和密度等,然后选择合适的k 。
(2)对k个初始质心的选择比较敏感,容易陷入局部最小值。例如,我们上面的算法运行的时候,有可能会得到不同的结果,如下面这两种情况。K-means也是收敛了,只是收敛到了局部最小值:
改进:
有人提出了另一个成为二分k均值(bisecting k-means)算法,它对初始的k个质心的选择就不太敏感 。
(3)存在局限性,如下面这种非球状的数据分布就搞不定了:
(4)数据集比较大的时候,收敛会比较慢.
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://www.cnblogs.com/ahu-lichang/p/7161613.html 。
最后此篇关于K-means聚类算法介绍与利用python实现的代码示例的文章就讲到这里了,如果你想了解更多关于K-means聚类算法介绍与利用python实现的代码示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在后台开启了“URL Rewrite”,看起来一切正常,可是点击某一栏目的时候却怎么都进不去,显示的依然是论坛的首页。看了一下论坛目录下,原来这下面并没有自己的.htaccess文件,所以默认使用的
本文实例为大家分享了.net发送邮件的实现代码,供大家参考,具体内容如下 关键代码: 需要引用命名空间: using System.Net.Mail; using System.Net;
今天的一个小测试是老师让用.NET用控件来制作一个拉菜单要求如下: 将鼠标移到父菜单上弹出3个子菜单,而且每个子菜单都有超链接。 以下是我自己做的代码: 复制代
我有以下内容 static const unsigned int chromosome = 6; double bestFitness[chromosomes]; for(int i = 0; i
关于附图,我需要一个计算算法来将 A 轴向下移动 n 英寸,将 B 轴从左向右移动 m 英寸,以便组件圆 D 遵循抛物线的曲线;圆 D 并不总是 10 英寸,可以更小。我不是数学专业的,所以这对我来说
我正在尝试利用我的格式字符串错误,它存在于这个程序中: #include #include #include #include #include void foo(char* tmp, ch
用Matplotlib和Seaborn这类Python库可以画出很好看的图,但是这些图只是静态的,难以动态且美观地呈现数值变化。要是在你下次的演示、视频、社交媒体Po文里能用短视频呈现数据变化,是不
1、进程介绍 进程:正在执行的程序,由程序、数据和进程控制块组成,是正在执行的程序,程序的一次执行过程,是资源调度的基本单位。 程序:没有执行的代码,是一个静态的。 2、线程
1、前言 在开发过程中,有时会遇到需要控制任务并发执行数量的需求。 例如一个爬虫程序,可以通过限制其并发任务数量来降低请求频率,从而避免由于请求过于频繁被封禁问题的发生。 接下来
Opera 管理着一个漏洞赏金计划,研究人员可以在该计划中报告 Opera 软件中的漏洞并获得奖励。 这篇文章就是我发现的一个漏洞——网页可能会从用户那里检索本地文件的屏幕截图。 考虑到 O
C++ 文件查找 在C++中我们要如何查找文件呢?我们需要一个结构体和几个大家可能不太熟悉的函数。这些函数和结构体在的头文件中,结构体为struct _finddata_t ,函数为_findfi
1、前言 本文利用 fsockopen() 函数,编写一个功能简单的端口扫描器。 2、关键技术 本实例的端口号是固定的,通过对数组的遍历,利用 fsockopen() 函数连接,如果连接成功,
最近在将一些项目的rest api迁移到.net core中,最开始是用的Nginx做反向代理,将已经完成切换的部分切入系统,如下图所示: 由于迁移过程中也在进行代码重构,需要经常比较频繁的测
前言 最近学习了python,感觉挺多地方能用到它的。打包 测试 上传 爬电影....而且代码量是真少。人生苦短,我用python。而今天写的这个是因为下载电影时总会发现除了视频还会有这两个文件,
1、Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序
一直想写一套生成静态页面的文章系统 但面对生成静态后的一些复杂数据库交互问题。又望而却步! 于是就想 有没有 在不耽误数据交互的情况下,而又能降低服务器负
Qt 利用大量第 3 方库进行图像编码、压缩、加密、音频和视频编解码器支持等。 从历史上看,当我想使用它们时,我总是必须将它们作为附加依赖项包含在内。我一直想知道是否有一种方法可以简单地重用 Qt 已
我想知道是否可以使用属性将功能“混合”到类/方法/属性中。 就像是: [TrackChanges] public Foo { get; set; } 如果可能的话,有谁会如何实现? 最佳答
有些站点位于共享主机(Windows 2003 Server)上,因此我无法访问服务器配置。 我到处都读到关于杠杆浏览器缓存的信息,特别是静态文件(jpg,css,js等)的信息,但是...在我的情况
我想在我的项目中使用 Julia 的主要原因之一是它的速度,尤其是在计算积分方面。 我想在某个区间 [a,b] 上积分一维函数 f(x)。一般来说,Julia 的 quadgk 函数将是一个快速而准确
我是一名优秀的程序员,十分优秀!