聚类 python_python中实现k-means聚类算法详解

算法优缺点:

优点:容易实现

缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢

使用数据类型:数值型数据

算法思想

k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。

1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的选择方法有两种一种是elbow method,简单的说就是根据聚类的结果和k的函数关系判断k为多少的时候效果最好。另一种则是根据具体的需求确定,比如说进行衬衫尺寸的聚类你可能就会考虑分成三类(L,M,S)等

2.然后我们需要选择最初的聚类点(或者叫质心),这里的选择一般是随机选择的,代码中的是在数据范围内随机选择,另一种是随机选择数据中的点。这些点的选择会很大程度上影响到最终的结果,也就是说运气不好的话就到局部最小值去了。这里有两种处理方法,一种是多次取均值,另一种则是后面的改进算法(bisecting K-means)

3.终于我们开始进入正题了,接下来我们会把数据集中所有的点都计算下与这些质心的距离,把它们分到离它们质心最近的那一类中去。完成后我们则需要将每个簇算出平均值,用这个点作为新的质心。反复重复这两步,直到收敛我们就得到了最终的结果。

函数

loadDataSet(fileName)

从文件中读取数据集

distEclud(vecA, vecB)

计算距离,这里用的是欧氏距离,当然其他合理的距离都是可以的

randCent(dataSet, k)

随机生成初始的质心,这里是虽具选取数据范围内的点

kMeans(dataSet, k, distMeas=distEclud, createCent=randCent)

kmeans算法,输入数据和k值。后面两个事可选的距离计算方式和初始质心的选择方式

show(dataSet, k, centroids, clusterAssment)

可视化结果

#coding=utf-8

from numpy import *

def loadDataSet(fileName):

dataMat = []

fr = open(fileName)

for line in fr.readlines():

curLine = line.strip().split('\t')

fltLine = map(float, curLine)

dataMat.append(fltLine)

return dataMat

#计算两个向量的距离,用的是欧几里得距离

def distEclud(vecA, vecB):

return sqrt(sum(power(vecA - vecB, 2)))

#随机生成初始的质心(ng的课说的初始方式是随机选K个点)

def randCent(dataSet, k):

n = shape(dataSet)[1]

centroids = mat(zeros((k,n)))

for j in range(n):

minJ = min(dataSet[:,j])

rangeJ = float(max(array(dataSet)[:,j]) - minJ)

centroids[:,j] = minJ + rangeJ * random.rand(k,1)

return centroids

def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):

m = shape(dataSet)[0]

clusterAssment = mat(zeros((m,2)))#create mat to assign data points

#to a centroid, also holds SE of each point

centroids = createCent(dataSet, k)

clusterChanged = True

while clusterChanged:

clusterChanged = False

for i in range(m):#for each data point assign it to the closest centroid

minDist = inf

minIndex = -1

for j in range(k):

distJI = distMeas(centroids[j,:],dataSet[i,:])

if distJI < minDist:

minDist = distJI; minIndex = j

if clusterAssment[i,0] != minIndex:

clusterChanged = True

clusterAssment[i,:] = minIndex,minDist**2

print centroids

for cent in range(k):#recalculate centroids

ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]]#get all the point in this cluster

centroids[cent,:] = mean(ptsInClust, axis=0) #assign centroid to mean

return centroids, clusterAssment

def show(dataSet, k, centroids, clusterAssment):

from matplotlib import pyplot as plt

numSamples, dim = dataSet.shape

mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '

for i in xrange(numSamples):

markIndex = int(clusterAssment[i, 0])

plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])

mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '

for i in range(k):

plt.plot(centroids[i, 0], centroids[i, 1], mark[i], markersize = 12)

plt.show()

def main():

dataMat = mat(loadDataSet('testSet.txt'))

myCentroids, clustAssing= kMeans(dataMat,4)

print myCentroids

show(dataMat, 4, myCentroids, clustAssing)

if __name__ == '__main__':

main()

这里是聚类结果,还是很不错的啦

20171111163929236.jpg?20171011163955

但是有时候也会收敛到局部最小值,就像下面这样,就是不幸收敛到局部最优了

20171111164028330.jpg?20171011164048

总结

以上就是本文关于python中实现k-means聚类算法详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对本站的支持!

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

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

相关文章

python笔试常见题

1、冒泡排序&#xff1a; 冒泡排序算是最基本的python算法了。也算python面试遇到问的最多的了。 如果是封装成函数。代码如下&#xff1a; 如果初始就一个字典。那么代码为&#xff1a; 冒泡排序的本质就是两两比较。根据结果调换位置。最终达到一个排序的效果。 注&#xff1…

centos 关闭防火墙_CentOS7操作系统下如何关闭防火墙

centos系统如果不关闭防火墙在使用中会遇到不少问题&#xff0c;而且centos7和centos6关闭防火墙的方式不一样。centos6:1.永久性生效&#xff0c;重启后不会复原开启&#xff1a; chkconfig iptables on关闭&#xff1a; chkconfig iptables off2.即时生效&#xff0c;重启后复…

Apache的认证、授权、访问控制

原文链接&#xff1a; http://man.chinaunix.net/newsoft/Apache2.2_chinese_manual/howto/auth.html Apache认证、授权、访问控制 认证(Authentication)是指任何识别用户身份的过程。授权(Authorization)是允许特定用户访问特定区域或信息的过程。 相关模块和指令 认证和授权…

dim private public static_PHP中const,static,public,private,protected的区别

const: 定义常量&#xff0c;一般定义后不可改变static: 静态&#xff0c;类名可以访问public: 表示全局&#xff0c;类内部外部子类都可以访问&#xff1b;private: 表示私有的&#xff0c;只有本类内部可以使用&#xff1b;protected: 表示受保护的&#xff0c;只有本类或子类…

C#图解教程 第六章 深入理解类

深入理解类 类成员 前两章阐述了9种类成员中的两种&#xff1a;字段和方法。本章将会介绍除事件(第14章)和运算符外的其他类成员&#xff0c;并讨论其特征。 成员修饰符的顺序 字段和方法的声明可以包括许多如public、private这样的修饰符。本章还会讨论许多其他修饰符。多个修…

Apache用户身份验证

原文链接&#xff1a;http://www.yylog.org/?p4830 Apache用户身份验证 在apache应用过程中&#xff0c;管理员经常需要对apache下的目录做一些限制&#xff0c;不希望所有用户都能访问该目录下的文件&#xff0c;只对指定用户访问&#xff0c;此时我们就要用到apache用户身…

c# 获取word表格中的内容_Java 获取、删除Word文本框中的表格

本文介绍如何来获取Word文本框中包含的表格&#xff0c;以及删除表格。程序测试环境包括&#xff1a;IDEAJDK 1.8.0Spire.Doc.jar注&#xff1a;jar导入&#xff0c;可通过创建Maven程序项目&#xff0c;并在pom.xml中配置Maven仓库路径&#xff0c;并指定Free Spire.Doc for J…

PS抠图方法[photoshop中文教程]

PS抠图方法 一、魔术棒法——最直观的方法   适用范围&#xff1a;图像和背景色色差明显&#xff0c;背景色单一&#xff0c;图像边界清晰。   方法意图&#xff1a;通过删除背景色来获取图像。   方法缺陷&#xff1a;对散乱的毛发没有用。   使用方法&#xff1a…

FastReport使用方法(C/S版)

前言 这两天群里一直有群友问一些关于FastReport的问题&#xff0c;结合他们的问题&#xff0c;在这里做一个整理&#xff0c;有不明白的可以加 FastReport 交流群 群 号&#xff1a;554714044 工具 VS2017 FastReport 开始 1.新建项目&#xff0c;添加三个按钮。预览、设计、…

如何设置Linux时区为东八区

当我们购买美国VPS或服务器的时候&#xff0c;默认情况下是美国时间。对于我们定时执行某些任务会带来麻烦&#xff0c;所以需要设置时区为东八区。登录SSH后&#xff0c;执行tzselect命令。我们这里选择亚洲5.这里选择china 9。一般选东八区&#xff08;北京&#xff0c;广东&…

Windows 10系统安装JDK1.8与配置环境

第一步&#xff1a;下载JDK1.8 地址:https://www.oracle.com/index.html 第二步&#xff1a; 安装分两次&#xff0c;第一次是安装 jdk &#xff0c;第二次是安装 jre 。安装jdk默认的安装地址为C盘&#xff0c;安装目录 \java 之前的目录修改成你想放的目录&#xff1b;安装jr…

git安装与配置_git 安装及基本配置

git 基本上来说是开发者必备工具了&#xff0c;在服务器里没有 git 实在不太能说得过去。何况&#xff0c;没有 git 的话&#xff0c;面向github编程 从何说起&#xff0c;如同一个程序员断了左膀右臂。你对流程熟悉后&#xff0c;只需要一分钟便可以操作完成原文地址: 服务器 …

Apache伪静态学习

原文链接&#xff1a;http://www.benben.cc/blog/?p305 Apache中有着这样一个模块&#xff0c;它默默无闻&#xff0c;却是URL操作的瑞士军刀&#xff01;有人这样评价它&#xff1a;“尽管它的例子和文档数量可以以吨来计算&#xff0c;但它仍然是巫术&#xff0c;该死的巫术…

不同的容器里实现 RadioButton的单选

请教一个各位牛人一个问题&#xff0c;如图&#xff1a; &#xff08;问题解决&#xff0c;见后面的解决方案~~&#xff09; 怎么在不同的winform容器(GroupBox)里实现 RadioButton &#xff08;如图中两个“详细照会”&#xff09;的单选&#xff0c;请各位牛人给出实现的思…

html调用接口_搜狗ocr识别接口

详细情况在代码中说明&#xff0c;如果不想自己使用TensorFlow&#xff0c;可使用下面接口这是要识别的图片&#xff1a;最终识别的结果&#xff1a;This is a lot of 12 point text to test theocr code and see if it works on all typesof file format.The quick brown dog …

CSAcademy Or Problem

传送门 一口大锅&#xff08; 斜率的确是有单调性 并且可以进行凸优化的 明明是证出来的 为什么自己就不相信呢&#xff08; 我们发现对于当前点作为扩展的右端点 那么他前面至多有20个点会影响到这一段区间的或值 我们可以预处理记录出来这些节点的位置 很明显 答案随着右端点…

模块定义文件导出类_浓缩的就是精华——ES6模块精炼讲解

概述在 ES6 前&#xff0c; 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库&#xff0c; 和基于 CMD 规范的模块化库)。ES6 引入了模块化&#xff0c;其设计思想是在编译时就能确定模块的依赖关系&#xff0c;以及输入和输出的变量。ES6 的模块化分为…

Jquery1.6版本后attr的变化

原文链接&#xff1a;http://www.cnblogs.com/-run/archive/2011/11/16/2251569.html Jquery1.6版本后attr的变化 Jquery1.6版本后 attr 改动后的效果&#xff1a; jquery1.6版本&#xff1a; 下文来自www.jquery.com The difference betweenattributes and properties can b…

idea main scanner 输入_哇晒,你竟然不知道idea的 Live Templates

最近公司新近来一名程序猿&#xff0c;在写代码时&#xff0c;美美写到System.out.println的时候&#xff0c;都要一母不差的用键盘敲上去&#xff0c;我问他你之前有用过eclipse中的快捷方法syso吗&#xff1f;于是&#xff0c;我给他介绍了一下&#xff0c;在idea中如何自定义…

偷梁换柱做自己的封装系统

偷梁换柱做自己的封装系统&#xff01;菜鸟一开始都想把自己的信息加到系统里&#xff0c;但封装系统只会一点&#xff01;但我们可“拿来”&#xff0c;我们可以用偷梁换柱的方法来修改别人的系统&#xff0c;本文以雨林的GHOST5.0系统为例。一、准备工作1、当然是下载一个自己…