0.k-means算法

1.概念

  • k-means属于无监督学习的聚类算法。
  • 适用于:簇内相似性较高,簇间相似性较低。
  • k个初始聚簇中心的选择会影响结果。

2.实现过程:

  1. 选择初始的k个聚簇中心
  2. 把除开聚簇中心之外的点,依次计算到每个聚簇中心向量的距离。选择距离最近的聚簇中心,加入该簇。
  3. 更新聚簇中心:为簇内每个点的向量的平均值。
  4. 循环2、3,直到到达最大迭代次数或者聚簇中心不再发生改变。

1. 导入数据集

import numpy as np
import pandas as pddata=pd.read_csv("data/iris.csv")
t=data.iloc[:,:4]
t
SepalLength SepalWidth PetalLength PetalWidth
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
... ... ... ... ...
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8

150 rows × 4 columns

2. K-Means算法实现

class KMeans:"""使用python实现KMeans聚类"""def __init__(self,k,times):"""初始化方法:k:int 表示聚类的个数times:int 表示循环迭代的最多次数"""self.k=kself.times=timesdef fit(self,X):X=np.asarray(X)np.random.seed(666)#从数组中随机选择k个点作为初始聚类中心self.cluster_center_=X[np.random.randint(0,len(X),self.k)]self.labels_=np.zeros(len(X))#初始化所有数据标签为0for t in range(self.times):for index,x in enumerate(X):#计算每个样本中心与聚类中心的距离dis=np.sqrt(np.sum((x-self.cluster_center_)**2,axis=1))#将最小距离的索引赋值给标签数组,索引的值就是当前节点所在的簇。取值为[0,k-1]self.labels_[index]=dis.argmin()#dis.argmin()取值为[0,k-1]#循环遍历每一个簇for i in range(self.k):#计算每个簇内所有点的均值,跟新聚类中心self.cluster_center_[i]=np.mean(X[self.labels_==i],axis=0)def predict(self,X):"""预测样本属于哪一个簇"""X=np.asarray(X)result=np.zeros(len(X))for index ,x in enumerate(X):#计算样本到每个聚类中心的距离dis=np.sqrt(np.sum((x-self.cluster_center_)**2,axis=1))#找到距离最近的聚类中心,划分类别result[index]=dis.argmin()return result

3. 创建kmeans对象,进行分类

kmeans=KMeans(3,50)
kmeans.fit(t)kmeans.cluster_center_
array([[6.85      , 3.07368421, 5.74210526, 2.07105263],[5.006     , 3.418     , 1.464     , 0.244     ],[5.9016129 , 2.7483871 , 4.39354839, 1.43387097]])
#查看某个簇内的所有样本数据
t[kmeans.labels_==0]
SepalLength SepalWidth PetalLength PetalWidth
52 6.9 3.1 4.9 1.5
77 6.7 3.0 5.0 1.7
100 6.3 3.3 6.0 2.5
102 7.1 3.0 5.9 2.1
103 6.3 2.9 5.6 1.8
104 6.5 3.0 5.8 2.2
105 7.6 3.0 6.6 2.1
107 7.3 2.9 6.3 1.8
108 6.7 2.5 5.8 1.8
109 7.2 3.6 6.1 2.5
110 6.5 3.2 5.1 2.0
111 6.4 2.7 5.3 1.9
112 6.8 3.0 5.5 2.1
115 6.4 3.2 5.3 2.3
116 6.5 3.0 5.5 1.8
117 7.7 3.8 6.7 2.2
118 7.7 2.6 6.9 2.3
120 6.9 3.2 5.7 2.3
122 7.7 2.8 6.7 2.0
124 6.7 3.3 5.7 2.1
125 7.2 3.2 6.0 1.8
128 6.4 2.8 5.6 2.1
129 7.2 3.0 5.8 1.6
130 7.4 2.8 6.1 1.9
131 7.9 3.8 6.4 2.0
132 6.4 2.8 5.6 2.2
134 6.1 2.6 5.6 1.4
135 7.7 3.0 6.1 2.3
136 6.3 3.4 5.6 2.4
137 6.4 3.1 5.5 1.8
139 6.9 3.1 5.4 2.1
140 6.7 3.1 5.6 2.4
141 6.9 3.1 5.1 2.3
143 6.8 3.2 5.9 2.3
144 6.7 3.3 5.7 2.5
145 6.7 3.0 5.2 2.3
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
#对数据进行预测
kmeans.predict([[6.2,2.5,5.0,2.1],[5.2,4.0,5.6,2.5],[5.0,4.0,6.0,4.0]])
array([2., 0., 0.])

4. 进行可视化

#选取两个特征进行训练,方便进行可视化
t2=data.loc[:,"SepalLength":"SepalWidth"]
my_kmeans=KMeans(3,50)
my_kmeans.fit(t2)import matplotlib as mpl
import matplotlib.pyplot as pltmpl.rcParams["font.family"]="SimHei"
mpl.rcParams["axes.unicode_minus"]=Falseplt.figure(figsize=(10,10))
#绘制每个类别的散点图
plt.scatter(t2[kmeans.labels_==0].iloc[:,0],t2[kmeans.labels_==0].iloc[:,1],label="类别1")
plt.scatter(t2[kmeans.labels_==1].iloc[:,0],t2[kmeans.labels_==1].iloc[:,1],label="类别2")
plt.scatter(t2[kmeans.labels_==2].iloc[:,0],t2[kmeans.labels_==2].iloc[:,1],label="类别3")
plt.scatter(my_kmeans.cluster_center_[:,0],my_kmeans.cluster_center_[:,1],marker="+",s=300)
plt.title("聚类分析")
plt.xlabel("SepalLength")
plt.ylabel("SepalWidth")
plt.legend()
<matplotlib.legend.Legend at 0x26005241308>

5. 使用sklearn包的kMeans

import numpy as np
from sklearn import datasetsiris =datasets.load_iris()iris.feature_names
['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']
from sklearn.cluster import KMeans
kmeans=KMeans(n_clusters=3,init='k-means++',random_state=666)
#init='k-means++'/'random'random是指随机取k个值,'k-means++'避免选择较差起始点
predict=kmeans.fit_predict(iris.data)
predict
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2,2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 2, 0, 2, 0, 2, 2, 0, 0, 2, 2, 2, 2,2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 0])
plt.figure(figsize=(10,10))
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"]="SimHei"
mpl.rcParams["axes.unicode_minus"]=False
#将聚类结果显示
plt.scatter(iris.data[predict == 0, 0], iris.data[predict== 0, 1],label = '类型1')
#[predict == 0, 2], 类型为0的sepal length (cm)在第1的栏位,所以是0,sepal width (cm)是第2栏位,所以是1
plt.scatter(iris.data[predict == 1, 0], iris.data[predict== 1, 1], label = '类型2')
plt.scatter(iris.data[predict == 2, 0], iris.data[predict== 2, 1], label = '类型3')
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],marker="+",s=300)
plt.title('鸢尾花聚簇分类')
plt.xlabel('sepalLength')
plt.ylabel('sepalWidth')
plt.legend()
<matplotlib.legend.Legend at 0x1c4d6076308>

阿里云大学笔记——K-Means聚类算法相关推荐

  1. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  2. k means聚类算法_K-Means 聚类算法 20210108

    说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...

  3. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  4. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  5. K-means(K均值聚类算法)算法笔记

    K-means(K均值聚类算法)算法笔记 K-means 算法,是比较简单的无监督的算法,通过设定好初始的类别k,然后不断循环迭代,将给定的数据自动分为K个类别.事实上,大家都知道K-means是怎么 ...

  6. 数据分析——K-Means(K均值聚类算法)——糖潮丽子

    申明:文章内容是作者自己的学习笔记,教学来源是开课吧讲师梁勇老师. 讲师介绍:梁老师 <细说Java>与<Java深入解析>图书作者.一线互联网资深数据分析专家,超过十年软件开 ...

  7. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  8. K-Means(K均值聚类算法)

    K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...

  9. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

最新文章

  1. ModuleNotFoundError: No module named ‘cx_Oracle‘
  2. [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
  3. inet_ntoa()返回字符串的生命周期
  4. 1. 机器学习-特征工程
  5. 从补码的来源剖析到为啥补码=原码按位取反+1
  6. java如何打开整个package_Qulice - 如何在整个项目中禁用需要package-info.java的规则?...
  7. Dubbo-go 优雅上下线设计与实践
  8. Yii模块内生成CRUD
  9. 人工智能为什么这么火?
  10. Python——rrdtool模块的安装
  11. Mac OS X / IOS 内存管理机制简要说明
  12. python程序化设计正则表达式语法_基于python的正则表达式学习笔记
  13. 在 Nvidia 显卡下设置装备铺排双浮现器
  14. 大电流场效应管500a_不可不知的电子工程常用的6大电子元器件,了解一下!
  15. sap导入中文数据乱码
  16. 采用计算机控制的实例,计算机控制系统的实例
  17. Java服务端支付功能模块--(一)支付宝支付
  18. DDR VTT供电解决方案
  19. centos安装matlab2018的步骤(基本是借鉴的但是会有些自己的解释及补充)
  20. 智慧停车场综合解决方案

热门文章

  1. 图形机器人编程入门教程
  2. 如何给证件照换背景色并压缩到100K
  3. Windows10激活自带Linux子系统以及Linux子系统安装位置介绍
  4. 下一代MacBook Air:我们想要什么与我们可以期待什么
  5. GPT4和ChatGPT的区别,太让人震撼
  6. Docker | 分布式模拟
  7. get和post特点
  8. 跟着换屏哥手机维修工程师,轻松排除iphone手机小故障
  9. LeetCode:342(Python)—— 4 的幂(简单)
  10. 【spring】Spring事件监听器ApplicationListener的使用与源码分析