Lab - K-Means
1 K-Means Clustering
1.1 Input Data
导入标准模块和数据集
# Import the standard modules to be used in this lab
import pandas as pd
import numpy as np
%matplotlib inline
现在,我们将数据集加载到IPython中,并将其加载到数据帧中。
cust_pd = pd.read_csv("customers.csv")
Now, let’s have a look at the first five data
cust_pd.head()
输出如下:
1.2 Clustering using K-Means
让我们把这些数据画出来,看看我们是否能看到任何群集。为此,我们将使用散点图
Seaborn图书馆。Seaborn是一个基于matplotlib的Python数据可视化库。
首先,我们导入matplotlib和seaborn库。然后我们创建一个数字,并确定他的数字
画出散点图。你能看到多少个集群?
# set the backend of matplotlib to 'inline' to display the plot within Jupyter␣
,→notebook
from matplotlib import pyplot as plt
import seaborn as sns
plt.figure(figsize=(8,5))
sns.scatterplot(x=cust_pd["Income"], y=cust_pd["Debt"])
输出如下:
正如我们所看到的,属性收入和债务是在非常不同的范围,收入是关于10-20倍的债务。因此,在进行聚类之前,我们先对数据进行归一化处理(0 - 1)。在这里,我们通过使用min()和max()函数手动进行规范化。我们还可以用标准化数据的MinMaxScaler。
cust_pd["Income"] = (cust_pd["Income"] - cust_pd["Income"].min()) /␣
,→(cust_pd["Income"].max() - cust_pd["Income"].min())
cust_pd["Debt"] = (cust_pd["Debt"] - cust_pd["Debt"].min()) / (cust_pd["Debt"].
,→max() - cust_pd["Debt"].min())
cust_pd.head()
#from sklearn.preprocessing import MinMaxScaler
#scaler = MinMaxScaler()
#cust_pd = scaler.fit_transform(cust_pd)
#cust_pd = pd.DataFrame(cust_pd, columns=["Income", "Debt"])
#cust_pd.head()
输出如下:
现在让我们从Scikit-Learn导入K-means来创建一个K-means对象。我们将设置数字集群,K = 4。假设有4组。
from sklearn.cluster import KMeans
首先,我们初始化重心。然后,我们创建一个KMeans对象并设置以下参数。N_clusters用于指定集群的数量。Init用于指定初始质心。n_init设置为1,表示K-means算法将运行一次。
init_centroids = np.array([[0.01,0.02],[0.01,0.015],[0.01,0.022],[0.01,0.023]])
kmeans = KMeans(n_clusters=4, init=init_centroids, n_init=1)
kmeans.fit(cust_pd)
输出如下:
我们可以看到算法为最终的簇生成的质心值
centroids = kmeans.cluster_centers_
print(centroids)
输出如下,可以看到这是第二次计算出新的质心。
让我们使用散点图来显示集群。
offset = 0.07
fig, ax = plt.subplots()
sns.scatterplot(x=cust_pd["Income"], y=cust_pd["Debt"])
sns.scatterplot(x=centroids[:,0], y=centroids[:,1])
ax.annotate('Cluster 1', xy=(centroids[0,0]-offset,centroids[0,1]-offset))
ax.annotate('Cluster 2', xy=(centroids[1,0]-offset,centroids[1,1]-offset))
ax.annotate('Cluster 3', xy=(centroids[2,0]-offset,centroids[2,1]-offset))
ax.annotate('Cluster 4', xy=(centroids[3,0]-offset,centroids[3,1]-offset))
输出如下:
质心用黄色的“o”标记。我们添加了一些注释来表示聚类数。现在,让我们使用K-mean模型对数据点进行预测。
offset = 0.07
pred = kmeans.predict(cust_pd)
#cust_pd.insert(2, "Class", pred)
fig, ax = plt.subplots()
sns.scatterplot(x=cust_pd["Income"], y=cust_pd["Debt"], hue=pred)
sns.scatterplot(x=centroids[:,0], y=centroids[:,1])
ax.annotate('Cluster 1', xy=(centroids[0,0]-offset,centroids[0,1]-offset))
ax.annotate('Cluster 2', xy=(centroids[1,0]-offset,centroids[1,1]-offset))
ax.annotate('Cluster 3', xy=(centroids[2,0]-offset,centroids[2,1]-offset))
ax.annotate('Cluster 4', xy=(centroids[3,0]-offset,centroids[3,1]-offset))
输出如下:
K mean ++
接下来我们使用K mean ++来聚类
kmeans = KMeans(n_clusters=4, init='k-means++')
kmeans.fit(cust_pd)
centroids = kmeans.cluster_centers_
print(centroids)
输出四个质心:
: offset = 0.07
pred = kmeans.predict(cust_pd)
fig, ax = plt.subplots()
sns.scatterplot(x=cust_pd["Income"], y=cust_pd["Debt"], hue=pred)
sns.scatterplot(x=centroids[:,0], y=centroids[:,1])
ax.annotate('Cluster 1', xy=(centroids[0,0]-offset,centroids[0,1]-offset))
ax.annotate('Cluster 2', xy=(centroids[1,0]-offset,centroids[1,1]-offset))
ax.annotate('Cluster 3', xy=(centroids[2,0]-offset,centroids[2,1]-offset))
ax.annotate('Cluster 4', xy=(centroids[3,0]-offset,centroids[3,1]-offset))
聚类结果如下:
让我们设置K=6:
: kmeans = KMeans(n_clusters=6)
kmeans.fit(cust_pd)
centroids = kmeans.cluster_centers_
print(centroids)
offset = 0.07
pred = kmeans.predict(cust_pd)
fig, ax = plt.subplots()
sns.scatterplot(x=cust_pd["Income"], y=cust_pd["Debt"], hue=pred)
sns.scatterplot(x=centroids[:,0], y=centroids[:,1])
ax.annotate('Cluster 1', xy=(centroids[0,0]-offset,centroids[0,1]-offset))
ax.annotate('Cluster 2', xy=(centroids[1,0]-offset,centroids[1,1]-offset))
ax.annotate('Cluster 3', xy=(centroids[2,0]-offset,centroids[2,1]-offset))
ax.annotate('Cluster 4', xy=(centroids[3,0]-offset,centroids[3,1]-offset))
ax.annotate('Cluster 5', xy=(centroids[4,0]-offset,centroids[4,1]-offset))
ax.annotate('Cluster 6', xy=(centroids[5,0]-offset,centroids[5,1]-offset))
让我们研究不同数量的簇的距离(惯性)平方之和确定最佳值。
inrt = []
m = 15
for c in range(2,m):
km = KMeans(n_clusters=c)
km.fit(cust_pd.iloc[:,0:2])
inrt.append(km.inertia_)
plt.figure(figsize=(8,5))
plt.plot([c for c in range(2,m)], inrt, marker='.', markersize=14)
plt.xlabel("# of clusters")
plt.ylabel("Inertia (Sum of squared distance)")
输出如下:
我们可以看到,经过6个簇后,惯性并没有明显减少。我们可以得出6是最优集群数。
Lab - K-Means相关推荐
- OpenCV的k - means聚类 -对图片进行颜色量化
OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...
- OpenCV官方文档 理解k - means聚类
理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...
- kmeans改进 matlab,基于距离函数的改进k―means 算法
摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...
- 文献记录(part89)--I-k-means-+:An iterative clustering algorithm based on an enhanced k -means
学习笔记,仅供参考,有错必究 关键词:k均值:解决方案改进:准确的k均值:迭代改进 I-k-means-+:An iterative clustering algorithm based on an ...
- K means 图片压缩
k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...
- 为了联盟还是为了部落 | K means
1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- k means聚类算法_一文读懂K-means聚类算法
1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...
- simple k means
//选择初始的k个质点 for (int j = initInstances.numInstances() - 1; j >= 0; j--) { instIndex = RandomO.nex ...
- k means聚类算法_K-Means 聚类算法 20210108
说到聚类,应先理解聚类和分类的区别 聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来. K-Means 聚类算法有很多种 ...
最新文章
- Throwable是java.lang包中一个专门用来处理异常的类
- react学习系列1 修改create-react-app配置支持stylus
- go read text file into string array
- Python关键点常识
- dump 大文件分析工具Jprofile
- 同义句转换在线翻译器的软件
- 用这几款软件轻松自动识别图片文字,快码住
- python zip 压缩文件夹
- 制作u盘winpe启动盘_如何制作U盘启动盘
- springboot+基于Web的开关柜综合监测信息查询系统的设计与实现 毕业设计-附源码191550
- 全面解读“数字孪生”
- Amazon Alexa硬件方案选型
- VScode 设置 背景图片
- flask中ajax的使用,jquery – 使用ajax时,Flask flash消息不再有效
- 微信公众号运营数据分析
- mysql存储字典,详解MySQL-8.0数据字典
- Can't locate Tk.pm
- 移动端字体显示大小和css设置大小的不一致解决方案
- WinForm通过Excel作为中间介质实现导入导出小工具
- eureka心跳_8个Eureka优化技巧,让效率提高10倍
热门文章
- 面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型
- java通过socket传输文件
- 博客!新人从零开始学习编程的滥觞!写给自己的灯塔
- python实现采样函数_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现
- 王牌流量爆刷器 流量提升工具 网站刷新 增加浏览量 王牌软件
- idea实现svn拉分支和合并分支的教程
- F2FS文件系统工具编译及使用方法
- 启动Oracle服务报错:本地计算机上的OracleOraDb10g_homeTNSListener服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。
- TFTP服务器的下载与上传
- PMP项目管理项目资源管理