阿里云大学笔记——K-Means聚类算法
0.k-means算法
1.概念
- k-means属于无监督学习的聚类算法。
- 适用于:簇内相似性较高,簇间相似性较低。
- k个初始聚簇中心的选择会影响结果。
2.实现过程:
- 选择初始的k个聚簇中心
- 把除开聚簇中心之外的点,依次计算到每个聚簇中心向量的距离。选择距离最近的聚簇中心,加入该簇。
- 更新聚簇中心:为簇内每个点的向量的平均值。
- 循环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聚类算法相关推荐
- k means聚类算法_一文读懂K-means聚类算法
1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...
- k means聚类算法_K-Means 聚类算法 20210108
说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- K-means(K均值聚类算法)算法笔记
K-means(K均值聚类算法)算法笔记 K-means 算法,是比较简单的无监督的算法,通过设定好初始的类别k,然后不断循环迭代,将给定的数据自动分为K个类别.事实上,大家都知道K-means是怎么 ...
- 数据分析——K-Means(K均值聚类算法)——糖潮丽子
申明:文章内容是作者自己的学习笔记,教学来源是开课吧讲师梁勇老师. 讲师介绍:梁老师 <细说Java>与<Java深入解析>图书作者.一线互联网资深数据分析专家,超过十年软件开 ...
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- K-Means(K均值聚类算法)
K-Means(K均值聚类算法) 1.前言 要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k-means均值聚类学习算法 ...
- k均值聚类算法python_K均值和其他聚类算法:Python快速入门
k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...
最新文章
- ModuleNotFoundError: No module named ‘cx_Oracle‘
- [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
- inet_ntoa()返回字符串的生命周期
- 1. 机器学习-特征工程
- 从补码的来源剖析到为啥补码=原码按位取反+1
- java如何打开整个package_Qulice - 如何在整个项目中禁用需要package-info.java的规则?...
- Dubbo-go 优雅上下线设计与实践
- Yii模块内生成CRUD
- 人工智能为什么这么火?
- Python——rrdtool模块的安装
- Mac OS X / IOS 内存管理机制简要说明
- python程序化设计正则表达式语法_基于python的正则表达式学习笔记
- 在 Nvidia 显卡下设置装备铺排双浮现器
- 大电流场效应管500a_不可不知的电子工程常用的6大电子元器件,了解一下!
- sap导入中文数据乱码
- 采用计算机控制的实例,计算机控制系统的实例
- Java服务端支付功能模块--(一)支付宝支付
- DDR VTT供电解决方案
- centos安装matlab2018的步骤(基本是借鉴的但是会有些自己的解释及补充)
- 智慧停车场综合解决方案