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相关推荐

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

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

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

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

  3. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  4. 文献记录(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 ...

  5. K means 图片压缩

    k-means的基本原理较为清晰,这里不多赘述,本次博客主要通过基础的k means算法进行图像的压缩处理. 原理分析 在彩色图像中,每个像素的大小为3字节(RGB),可以表示的颜色总数为256 * ...

  6. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

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

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

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

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

  9. simple k means

    //选择初始的k个质点 for (int j = initInstances.numInstances() - 1; j >= 0; j--) { instIndex = RandomO.nex ...

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

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

最新文章

  1. Throwable是java.lang包中一个专门用来处理异常的类
  2. react学习系列1 修改create-react-app配置支持stylus
  3. go read text file into string array
  4. Python关键点常识
  5. dump 大文件分析工具Jprofile
  6. 同义句转换在线翻译器的软件
  7. 用这几款软件轻松自动识别图片文字,快码住
  8. python zip 压缩文件夹
  9. 制作u盘winpe启动盘_如何制作U盘启动盘
  10. springboot+基于Web的开关柜综合监测信息查询系统的设计与实现 毕业设计-附源码191550
  11. 全面解读“数字孪生”
  12. Amazon Alexa硬件方案选型
  13. VScode 设置 背景图片
  14. flask中ajax的使用,jquery – 使用ajax时,Flask flash消息不再有效
  15. 微信公众号运营数据分析
  16. mysql存储字典,详解MySQL-8.0数据字典
  17. Can't locate Tk.pm
  18. 移动端字体显示大小和css设置大小的不一致解决方案
  19. WinForm通过Excel作为中间介质实现导入导出小工具
  20. eureka心跳_8个Eureka优化技巧,让效率提高10倍

热门文章

  1. 面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型
  2. java通过socket传输文件
  3. 博客!新人从零开始学习编程的滥觞!写给自己的灯塔
  4. python实现采样函数_PR Sampling Ⅰ: 蒙特卡洛采样、重要性采样及python实现
  5. 王牌流量爆刷器 流量提升工具 网站刷新 增加浏览量 王牌软件
  6. idea实现svn拉分支和合并分支的教程
  7. F2FS文件系统工具编译及使用方法
  8. 启动Oracle服务报错:本地计算机上的OracleOraDb10g_homeTNSListener服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。
  9. TFTP服务器的下载与上传
  10. PMP项目管理项目资源管理