热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python聚类分析sklearn_kmeans聚类算法的python实现和sklearn的聚类器

k-means聚类算法的python实现和sklearn的聚类器文章目录k-means聚类算法的python实现和sklearn的聚类器1.标准k-means聚类算法2.sklea

k-means聚类算法的python实现和sklearn的聚类器

文章目录

k-means聚类算法的python实现和sklearn的聚类器1. 标准k-means聚类算法2. sklearn.cluster.KMeans

1. 标准k-means聚类算法

k-means是一个迭代算法,需要人为指定聚类数量。因为实现简单、对大样本有很好的拓展性被广泛采用。 算法初始化阶段首先随机选取不重复的

k

k

k个点作为 初始的聚类中心(称为Centroid)。不断重复执行以下两个步骤:

给每个点

x

i

x_i

xi分配所属类别

l

i

l_i

li

l

i

=

a

r

g

m

i

n

j

{

d

(

x

i

,

μ

j

)

}

l_i=\mathop{argmin}_{j}\{d(x_i,\mu_j)\}

li=argminj{d(xi,μj)}根据分配结果重新计算每个聚类的均值

μ

j

=

1

{

l

i

=

j

}

x

i

1

{

l

i

=

j

}

\mu_j=\frac{1\{l_i=j \}x_i}{1\{l_i=j\}}

μj=1{li=j}1{li=j}xi

实现代码如下,实际上实现k-means算法的代码只有def k_means(dist, xy, k,centroids=None):的几行。

# k-means 聚类算法

import numpy as np

import numpy.linalg as la

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

plt.rcParams.update({

'savefig.dpi': 600,

'mathtext.fontset':'cm',

'font.sans-serif':'SimHei',

'axes.unicode_minus': False

})

def k_means(dist, xy, k,centroids=None):

# 随机不重复地选取 k 个点作为初始聚类中心

if not centroids:

centroids = np.random.choice(np.arange(dist.shape[0]),k,replace=False)

index = np.arange(dist.shape[0])

while True:

# 给每个点分配所属类别

groupid = np.argmin(dist[:,centroids], axis=-1)

# 生成类别索引

groups = [np.where(groupid == id,True,False) for id in range(len(centroids))]

# 重新计算每一类的均值

kmeans = np.array([np.mean(xy[group],axis=0) for group in groups])

# 重新选定聚类中心

centroids_new = np.argmin(la.norm(xy[:,None,:] - kmeans,ord=2,axis=-1)**2,axis=0)

# 如果聚类中心不再变化,算法结束

if np.all(centroids == centroids_new):

return centroids,[index[group] for group in groups]

centroids = centroids_new

def get_dist():

X,Y = np.meshgrid(np.arange(10),np.arange(10))

xy = np.vstack((X.ravel(),Y.ravel())).T

dist = la.norm(xy[:,None,:] - xy,ord=2, axis=-1)

return dist, np.array(xy)

_, xy = get_dist()

X,Y = xy[:,0],xy[:,1]

fig,ax = plt.subplots()

ax.scatter(X.ravel(),Y.ravel(),marker='o',facecolor='white',edgecolor='k')

plt.show()

def cluster_diagram(centroids, groups, cmap=['r','g','b','k'],centroids_marker='D'):

# 'D' -- 'diamond'

fig, ax = plt.subplots()

for i in range(len(centroids)):

group,center = groups[i],centroids[i]

ax.scatter(X[group],Y[group],marker='o',facecolor='white',edgecolor=cmap[i])

ax.scatter(X[center],Y[center],marker=centroids_marker,facecolor='white',edgecolor=cmap[i],linewidth=2)

plt.show()

def main():

dist, xy = get_dist()

centroids, groups = k_means(dist,xy,4)

#     centroids, groups = k_means(*get_dist(),4,centroids=[54,55,64,65])

print(centroids, *groups,sep='\n')

cluster_diagram(centroids,groups)

# sklearn.cluster.KMeans

kmeans = KMeans(4)

kmeans.fit(xy)

print(kmeans.labels_,kmeans.cluster_centers_,sep='\n')

if __name__ == '__main__':

main()

首先生成了坐标系上的

100

100

100个点坐标和相应的距离矩阵。这里是点的坐标分布:

经过k_means函数聚类后画出聚类结果图。这里是聚类结果:(选取最中间的四个点[54,55,64,65]可以得到最均匀的聚类结果)

最后调用了sklearn.cluster.KMeans,和它的结果对比。

我的函数k_means():

聚类中心:[22 27 72 77]

所属类别:

[ 0  1  2  3  4 10 11 12 13 14 20 21 22 23 24 30 31 32 33 34 40 41 42 43

44]

[ 5  6  7  8  9 15 16 17 18 19 25 26 27 28 29 35 36 37 38 39 45 46 47 48

49]

[50 51 52 53 54 60 61 62 63 64 70 71 72 73 74 80 81 82 83 84 90 91 92 93

94]

[55 56 57 58 59 65 66 67 68 69 75 76 77 78 79 85 86 87 88 89 95 96 97 98

99]

skleaern.cluster.KMeans:

聚类中心:

[[2. 2.]

[2. 7.]

[7. 7.]

[7. 2.]]

所属类别:

[0 0 0 0 0 3 3 3 3 3 0 0 0 0 0 3 3 3 3 3 0 0 0 0 0 3 3 3 3 3 0 0 0 0 0 3 3

3 3 3 0 0 0 0 0 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 2 2 2 2 2 1 1 1 1

1 2 2 2 2 2 1 1 1 1 1 2 2 2 2 2 1 1 1 1 1 2 2 2 2 2]

2. sklearn.cluster.KMeans

第一节的代码用到了sklearn.cluster.KMeans,这里搬运一个官方文档给出的示例代码:

>>> from sklearn.cluster import KMeans

>>> import numpy as np

>>> X = np.array([[1, 2], [1, 4], [1, 0],

...               [10, 2], [10, 4], [10, 0]])

>>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)

>>> kmeans.labels_

# 给出每个点所属类别的向量

array([1, 1, 1, 0, 0, 0], dtype=int32)

>>> kmeans.predict([[0, 0], [12, 3]])

# 预测类别

array([1, 0], dtype=int32)

>>> kmeans.cluster_centers_

# 聚类中心

array([[10.,  2.],

[ 1.,  2.]])



推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
author-avatar
Dark-胡俊賢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有