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. HTTP 499 状态码 nginx下 499错误
  2. c++队列指针 结构体指针
  3. vue element-ui 无法渲染表格数据解决
  4. 修改jquery文件上传插件uploadify的英文为中文
  5. java switch中if_详解java中if语句和switch的使用
  6. 系统类扩展方法,实现对所有类或某种类扩展自定义方法
  7. win11怎么回退原系统 Windows11回退的步骤方法
  8. 十进制转5421BCD(测试文件及modelsim.do文件的模板)——补充篇
  9. windows2008系统缓存修改
  10. Java基础(一):Java集合框架(超详细解析,看完面试不再怕)
  11. STM8S103系列IO口模拟串口通信(实现真正串口)
  12. Linux下安装各种常用软件
  13. 网络安全专家教你设置史上最安全的WiFi密码
  14. “挂羊头卖狗肉”的宇宙学谭
  15. 如何在阿里云物联网平台新增一个设备
  16. JAVAWeb学习笔记2020/5/15——JavaScript高级笔记
  17. 姜思达和机器人_姜思达爱上人工智能是怎么回事?
  18. Swing学习笔记目录
  19. 生活中的定律——破窗效应
  20. [半监督学习] Deep Co-Training for Semi-Supervised Image Recognition

热门文章

  1. 手机呼吸灯原来是这样用的,以前不知道,真的太浪费了
  2. python 关键字
  3. html鼠标悬停填充表格,鼠标移到表格上时,鼠标所在行放大高亮显示【实例】...
  4. OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks论文阅读笔记
  5. conda更新安装github下载的本地压缩包(zip)
  6. jspm 馨悦养生馆管理系统毕业设计(附源码、运行环境)
  7. pdf文件的分割使用工具
  8. 用python的opencv库在图片上画出蓝底黑字的文本框
  9. Redis学习笔记---Redis的模式订阅与退订
  10. 将PDF格式转换成其它文档