目录

概要

一、K均值算法

二、K值的选取:手肘法

三、用聚类实现鸢尾花数据分类

四、应用案例

1. 读取数据

2. 绘制手肘图

3. 找到最佳K值

4. 分类结果可视化


机器学习类型和算法的分类

无监督学习的数据集中没有输出标签y,常用的无监督学习算法有聚类和降维。

概要

聚类人有归纳和总结的能力,机器也有。聚类就是让机器把数据集中的样本按照特征的性质分组,这个过程中没有标签的存在。

聚类和监督学习中的分类问题有些类似,其主要区别在于:传统分类问题也就是说,在对猫狗图像分类之前,我们心里面已经对猫、狗图像形成了概念。这些概念指导着我们为训练集设定好标签。机器首先是学习概念,然后才能够做分类、做判断。分类的结果,还要接受标签,也就是已有概念的检验。

而聚类不同,虽然本质上也是“分类”,但是“譬如,漫天繁星,彼此之间并没有关联,也 没有星座的概念,当人们看到它们,是先根据星星在广袤苍穹中的位置将其一组一组地“聚集"起来,然后才逐渐形成星座的概念。人们说,这一-组星星是“大熊座",那一组星星是“北斗七星”。这个先根据特征进行分组,之后再概念化的过程就是聚类。聚类算法有好几种,K均值(K-means)是其中最常见的一种。

一、K均值算法

K均值算法是最容易理解的无监督学习算法。算法简单,速度也不差,但需要人工指定K值,也就是分成几个聚类。

具体算法流程:

(1)首先确定K的数值,比如5个聚类,也叫5个簇。

(2)然后再一大堆数据中随机挑选K个数据点,作为簇的质心(centroid)。这些随机质心当然不完美,别着急,它们会慢慢变得完美。

(3)遍历集合中每一个数据点,计算它们与每一个质心的距离(比如欧式距离)。数据点离哪个质心近,就属于哪一类。此时初始的K个类别开始形成。

(4)这时每一个质心中都聚集了很多数据点,于是质心说,你们来了,我就要“退役”了(这是个伟大的“禅让制度”啊!),选取一个新的质心吧。然后计算出每一类中最靠近中心的点,作为新的质心。此时新的质心会比原来随机选来的靠谱一些(等会儿用图展示质心的移动)

(5)重新进行步骤(3),计算所有数据点和新的质心的距离,在新的质心周围形成新的簇分配(“吃瓜群众”随风飘摇,离谁进就跟谁)。

(6)重新进行步骤(4),继续选择更好的质心(一代一代的“禅让”下去)。

(7)一直重复进行步骤(5)和(6),不断更新簇中的数据点,不断找到新的质心,直至收敛。

二、K值的选取:手肘法

聚类问题的关键在于K值的选取。也就是说,把一批数据划分为多少个簇是最合理的呢?当数据特征维度较少、数据分布较为分散时,可通过数据可视化的方法来人工确定K值。但当数据特征维度较多、数据分布较为混乱时,数据可视化帮助不大。

当然,也可以经过多次实验,逐步调整,使簇的数目逐渐达到最优,以符合数据集的特点。

这里我介绍一种直观的手肘法( elbow method)进行簇的数量的确定。手肘法是基于 对聚类效果的一一个度量指标来实现的,这个指标也可以视为一一种损失。 在K值很小的时候,整体损失很大,而随着K值的增大,损失函数的值会在逐渐收敛之前出现一个拐点。此时的K值就是比较好的值。

大家看下面的图,损失随着簇的个数而收敛的曲线有点像只手臂,最佳K值的点像是手肘,因此取名为手肘法。

三、用聚类实现鸢尾花数据分类

1. 数据读取

import numpy as np
import pandas as pd
dataset = pd.read_csv('D:/NoteBook/Iris.txt')
dataset.head()

#只对两个特征进行聚类,以便二维展示
X = dataset.iloc[:,[0,3]].values

下面尝试用不同的K值进行聚类的拟合

#聚类的集合,下面尝试用不同的K值进行聚类的拟合
from sklearn.cluster import KMeans#导入聚类模型
cost = []#初始化损失(距离)值
for i in range(1,11):#尝试不同的K值kmeans = KMeans(n_clusters= i ,init='k-means++', random_state = 0)kmeans.fit(X)cost.append(kmeans.inertia_)#inerita_是我们选择的方法,其作用相当于损失函数
#绘制手肘图找到最佳K值
import matplotlib.pyplot as plt
import seaborn as sns
hist,ax = plt.subplots()
plt.plot(range(1,11),cost)
# plt.title('The Elbow Method')
ax.set_title('The Elbow Method')
ax.set_ylabel('Cost')
plt.show()

kmeansmodel = KMeans(n_clusters=3, init='k-means++')
y_kmeans = kmeansmodel.fit_predict(X)
#把分类好的聚类可视化
hist,ax = plt.subplots()
plt.scatter(X[y_kmeans == 0,0], X[y_kmeans == 0,1],s = 100, c = 'cyan', label = 'Cluster 1')#聚类1
plt.scatter(X[y_kmeans == 1,0], X[y_kmeans == 1,1],s = 100, c = 'blue', label = 'Cluster 2')#聚类2
plt.scatter(X[y_kmeans == 2,0], X[y_kmeans == 2,1],s = 100, c = 'green', label = 'Cluster 3')#聚类3
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s = 200, c = 'yellow', label = 'Centroids')#质心
ax.set_title('鸢尾花花萼形成的聚类')#鸢尾花花萼形成的聚类
ax.set_xlabel('花萼长度')#
ax.set_ylabel('花萼宽度')#
plt.legend()
plt.show()

打印聚类结果图:

四、应用案例

本案例主要是基于企业注册资金和参保人数的企业聚类分析

1. 读取数据

import numpy as np
import pandas as pd
data = pd.read_excel('C:/新评分及数据补全合并.xlsx')
data.head()

注册资金数据去单位

import re
io = 'C:/新评分及数据补全合并.xlsx'
registered_capital = data['注册资本']
capital = []
for i in registered_capital:m = str(i).replace('-','0')               #匹配到“-”并替换为“0”now = re.match("\d*", m).group()          #group(0) 同 group() 就是匹配正则表达式整体结果capital.append(now)
data['注册资本新'] = pd.DataFrame(capital)     #数据存入Excel列
data['注册资本新'].head()
data.to_excel(io)                             #此行代码为数据存入Excel列,上面已存储,可注释        

数据归一化处理

from sklearn.preprocessing import MinMaxScaler
io = 'C:/新评分及数据补全合并.xlsx'
x1 = data[['注册资本新']]
x2 = data[['参保人数']]
# x2 = (x1 - np.min(x1))/(np.max(x1) - np.min(x1)) #注册资本归一化后的结果
min_max_scaler = MinMaxScaler()
X_train_minmax1 = min_max_scaler.fit_transform(x1)#注册资本归一化后的结果
X_train_minmax2 = min_max_scaler.fit_transform(x2)#参保人数归一化后的结果
data['注册资本归一化'] = pd.DataFrame(X_train_minmax1)     #数据存入Excel列
data['参保人数一化'] = pd.DataFrame(X_train_minmax2)     #数据存入Excel列
# pd.DataFrame(X_train_minmax1.tolist()).describe()
# pd.DataFrame(X_train_minmax2.tolist()).describe()
# data.to_excel(io) 

归一化结果

X2 = data.loc[:,['注册资本归一化','参保人数一化']].values
print(X2)

2. 绘制手肘图

#绘制手肘图
from sklearn.cluster import KMeans
cost = []
for i in range(1,11):kmeans = KMeans(n_clusters= i ,init='k-means++', random_state = 0)kmeans.fit(X2)cost.append(kmeans.inertia_)

3. 找到最佳K值

#绘制手肘图找到最佳K值
import matplotlib.pyplot as plt
import seaborn as sns
hist,ax = plt.subplots()
plt.plot(range(1,11),cost)
# plt.title('The Elbow Method')
ax.set_title('The Elbow Method')
ax.set_ylabel('Cost')
plt.show()

由手肘图可判断,最佳K值大概为4,我们选择4作为聚类个数

kmeansmodel = KMeans(n_clusters=4, init='k-means++')
y_kmeans = kmeansmodel.fit_predict(X2)

4. 分类结果可视化

#把分类好的聚类可视化
hist,ax = plt.subplots()
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.scatter(X2[y_kmeans == 0,0], X2[y_kmeans == 0,1],s = 100, c = 'cyan', label = 'Cluster 1')#聚类1
plt.scatter(X2[y_kmeans == 1,0], X2[y_kmeans == 1,1],s = 100, c = 'blue', label = 'Cluster 2')#聚类2
plt.scatter(X2[y_kmeans == 2,0], X2[y_kmeans == 2,1],s = 100, c = 'green', label = 'Cluster 3')#聚类3
plt.scatter(X2[y_kmeans == 3,0], X2[y_kmeans == 3,1],s = 100, c = 'red', label = 'Cluster 4')#聚类3
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s = 200, c = 'yellow', label = 'Centroids')#质心
ax.set_title('企业聚类')#客户形成的聚类
ax.set_xlabel('注册资本')#
ax.set_ylabel('参保人数')#
plt.legend()
plt.show()

企业聚类结果

由于我们的数据比较随机,并不是很规整,所以结果来看,聚类结果并不是十分美观。

无监督学习——K均值聚类的Python实现相关推荐

  1. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  2. 算法——机器学习——无监督学习—— K均值(K-means)图解动画

    快速排序 简介 算法过程 算法过程详解 一:聚类 二:聚类中心移动 算法结束 简介 k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预 ...

  3. 入门机器学习(十五)--无监督学习(K均值)

    1.无监督学习-简介(Unsupervised Learning-Introduction) 如下图所示是一个典型的监督学习,训练集中的每一个样本都有标签,我们需要根据标签来拟合一个假设函数. 什么是 ...

  4. 手写K-Means(K均值聚类的python实现)

    K-Means聚类算法原理 """ K-means impl, take square for example """ import ran ...

  5. k均值聚类的python代码_k-均值聚类Python代码实现

    这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...

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

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

  7. 机器学习算法与Python实践之k均值聚类(k-means)

    机器学习算法与Python实践之(五)k均值聚类(k-means) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Python实践这个系列主要是 ...

  8. Python金融数据挖掘 第11章 复习思考题1 (聚类)给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,用K均值聚类算法来训练模型,分4类。

    1.题目 给出一个数据集data_multivar.txt,里面有200个点坐标,在平面坐标系下可以画出它的散点图,如图11-12所示. data_multivar.txt 图11-12 数据集 da ...

  9. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

最新文章

  1. 实验1 查看CPU和内存、用机器指令和汇编指令编程
  2. sh里的变量 $0 $1 $$ $#
  3. python 分位数计算代码_Python数据分析第十一节 数据运算
  4. 计算机cmd是什么 74,CMD是什么?
  5. kafka 修改分区_kafka修改分区和副本数
  6. 有图形化显示,继承WebControl类
  7. 安装jdk配置环境变量JAVA_HOME不起作用
  8. 190923每日一句
  9. excel学习-自定义图表颜色(QQ截图+colorpix取色器)
  10. html水平分割线虚线代码,CSS分割线虚线代码
  11. python关键字详解_Python 关键字
  12. 一年中所有节日的排列顺序_我国一年中的传统节日。(按顺序)
  13. 解决eclips代码批量首行缩进 退格 调试
  14. Google翻译API使用案例
  15. Unity Universal RP asset not assigned
  16. 如何通过视频监控系统维护城市安全?
  17. WPF引入OCX控件
  18. Python-Web之前端基础介绍(上)
  19. 超级账本Fabric的架构与设计
  20. C语言学习(7)——全局变量和静态变量

热门文章

  1. Python基础学习备忘录上
  2. 读书笔记-精准努力-励志本身就已经让你爽了以为自己真这样做了
  3. ubuntu调试android设备不识别
  4. 新品周刊 | 星巴克推出威士忌桶酿咖啡;天梭年度旗舰新品卡森臻我系列腕表上市...
  5. MySQL官方示例数据库的使用
  6. elementUI表格分页排序
  7. js一天、两天倒计时定时器实现方案
  8. Python 位运算
  9. 支小蜜人脸识别消费系统实现校园、家长、学生三方共赢
  10. Oracle-08:连接查询