1目标

本次主要介绍机器学习之聚类,主要解决分类的问题。

通过KMean算法、KNN算法、MeanShift算法这三个算法的实战,通过对比,来了解和掌握各个算法的特点。

机器学习之聚类介绍

无监督学习

聚类

聚类分析

常用的聚类算法

K均值聚类

K近邻分析模型(KNN)

均值漂移聚类

实战准备

任务介绍

实战一:采用Kmeans算法实现2D数据类别划分

1、采用Kmeans算法实现2D数据自动聚类,预测V1=80,V2=60数据类别

2、完成结果矫正,计算预测准确率,

实战二:采用KNN算法实现2D数据类别划分

1、采用KNN算法实现2D数据的分类,预测V1=80,V2=60数据类别

2、计算预测准确率

实战三:采用MeanShift算法实现2D数据类别划分

1、采用MeanShift算法实现2D数据自动聚类,预测V1=80,V2=60数据类别

2、完成结果矫正,计算预测准确率,

流程

1、导入文件

2、定义X和y

3、可视化数据

4、创建模型

5、查看聚类的中心点

6、将中心点可视化

7、预测测试数据

8、基于训练数据进行预测

9、查看模型的准确率

10、可视化数据结果

11、矫正聚类结果

12、矫正后的结果重新进行准确率评估

13、重新将结果可视化

具体步骤

实战一:采用Kmeans算法实现2D数据类别划分

1、导入文件数据

import numpy as np
import pandas as pd
path='Desktop/artificial_intelligence/Chapter4/data.csv'
data=pd.read_csv(path)
data.head()

2、定义X和y

X=data.drop('labels',axis=1)
y=data['labels']
x1=X['V1']
x2=X['V2']
print(x1.shape,x2.shape,X.shape,y.shape)
y.value_counts()

(3000,) (3000,) (3000, 2) (3000,)

2 1156

1 954

0 890

Name: labels, dtype: int64

通过y的数据可以看到y有三个标签。

3、可视化数据

1、可视化不带标签的数据分布情况

from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(x1,x2)
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

2、可视化带标签的数据分布情况

fig2=plt.figure()
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

4、创建模型

from sklearn.cluster import KMeans
km=KMeans(n_clusters=3,random_state=0)
km.fit(X)

5、找到聚类的中心点

km.cluster_centers_

array([[ 69.92418447, -10.11964119],

[ 40.68362784, 59.71589274],

[ 9.4780459 , 10.686052 ]])

6、将中心点放到散点图中进行可视化

fig3=plt.figure()
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.scatter(center[:,0],center[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

7、预测测试数据:V1=80,V2=60

test_pred=km.predict([[80,60]])
test_pred

array([1], dtype=int32)

得到的结果是1,但是我们可以看到1是橙色的,结果为橙色的到底对不对呢,我们后面会有分析。

8、基于训练数据进行预测

y_predict=km.predict(X)
print(pd.value_counts(y_predict))
print(pd.value_counts(y))

1 1149

0 952

2 899

dtype: int64

2 1156

1 954

0 890

Name: labels, dtype: int64

9、查看模型准确率

from sklearn.metrics import accuracy_score
accu=accuracy_score(y,y_predict)
accu

0.0023333333333333335

可以看到几乎没有准确率,是真的预测不准,还是什么原因导致的呢,下面我们通过可视化数据对比查找原因。

10、可视化数据结果

fig4=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')plt.subplot(122)
label0=plt.scatter(x1[y_predict==0],x2[y_predict==0])
label1=plt.scatter(x1[y_predict==1],x2[y_predict==1])
label2=plt.scatter(x1[y_predict==2],x2[y_predict==2])
plt.scatter(center[:,0],center[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('predict data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

从上图可以看出来预测结果跟原始结果对比,可以发现,预测的图形是几乎一样的,但是颜色也就是标签的类别不一样,我们把预测的标签类别改成跟原始数据的标签类别一样,再测试下准确率。

11、矫正聚类结果

从上面可以得知,模型存在的问题是自动分类了,但是标签是模型自己定义的,跟我们自定义的标签不一致,所以要矫正标签结果,矫正后再进行准确率评估

y_corrected=[]
for i in y_predict:if i==2:y_corrected.append(0)elif i==0:y_corrected.append(1)else:y_corrected.append(2)
print(pd.value_counts(y_corrected),pd.value_counts(y))

2 1149

1 952

0 899

dtype: int64

2 1156

1 954

0 890

Name: labels, dtype: int64

12、重新进行准确率评估

accu_corrected=accuracy_score(y,y_corrected)
accu_corrected

0.997

可以看到矫正标签结果后的预测准确率达到了99.7%。说明整个模型的对这次数据的分类效果还是可以的。

13、重新可视化数据结果

1、先将数据转成numpy向量或者pandas的Series

y_corrected=np.array(y_corrected)
y_corrected

2、重新可视化

fig5=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')plt.subplot(122)
label0=plt.scatter(x1[y_corrected==0],x2[y_corrected==0])
label1=plt.scatter(x1[y_corrected==1],x2[y_corrected==1])
label2=plt.scatter(x1[y_corrected==2],x2[y_corrected==2])
plt.scatter(center[:,0],center[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('corrected data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

可以看到数据的标签更改后,模型的预测结果跟原始数据几乎一样,正确率达到了99.7%。

实战二:采用KNN算法实现2D数据类别划分

1、检查下数据

X.head()

y.head()

0 0

1 0

2 0

3 0

4 0

Name: labels, dtype: int64

print(X.shape,y.shape)

(3000, 2) (3000,)

数据没问题

2、建立KNN的模型

from sklearn.neighbors import KNeighborsClassifier
knn=KNeighborsClassifier(n_neighbors=3)
knn.fit(X,y)

3、预测测试数据 V1=80,V2=60

test_pre=knn.predict([[80,60]])
test_pre

array([2])

结果为2,也就是预测的标签为2

4、准确率评估

y_knn_pred=knn.predict(X)
accu_knn=accuracy_score(y,y_knn_pred)
accu_knn

1.0

正确率为100%。

5、对比原数据,可视化预测的结果

fig6=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')plt.subplot(122)
label0=plt.scatter(x1[y_knn_pred==0],x2[y_knn_pred==0])
label1=plt.scatter(x1[y_knn_pred==1],x2[y_knn_pred==1])
label2=plt.scatter(x1[y_knn_pred==2],x2[y_knn_pred==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('knn data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

可以看到是预测标签结果跟原数据是一模一样的。

实战三:采用MeanShift算法实现2D数据类别划分

MeanShift算法是无监督学习算法,训练数据只需有X,需要计算出带宽(区域半径)R。

优点是:不指定分类的个数。

1、导入模块

from sklearn.cluster import MeanShift

2、导入估算带宽的算法并生成带宽

from sklearn.cluster import estimate_bandwidth
bw=estimate_bandwidth(X,quantile=0.25,n_samples=500)
bw

22.316516974831334

参数的含义是:从X中随机选取500个样本,计算每一对样本的距离,然后选取这些距离的0.25分位数作为返回值

3、建立模型

ms=MeanShift(bandwidth=bw)
ms.fit(X)

4、查看预测结果有几个类别

y_pred_ms=ms.predict(X)
pd.value_counts(y_pred_ms)

也可以用查看center的方法查看又个center就有几个类别

center2=ms.cluster_centers_
center2

array([[ 40.76028371, 60.02078311],

[ 70.0425046 , -10.01220699],

[ 9.28397274, 10.79930746]])

5、可视化数据结果

fig7=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')plt.subplot(122)
label0=plt.scatter(x1[y_pred_ms==0],x2[y_pred_ms==0])
label1=plt.scatter(x1[y_pred_ms==1],x2[y_pred_ms==1])
label2=plt.scatter(x1[y_pred_ms==2],x2[y_pred_ms==2])
plt.scatter(center2[:,0],center2[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('meanshift data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

6、结果矫正

y_new=[]
for i in y_pred_ms:if i==0:y_new.append(2)elif i==2:y_new.append(0)else:y_new.append(1)
print(pd.value_counts(y_new),pd.value_counts(y))

2 1149

1 952

0 899

dtype: int64

2 1156

1 954

0 890

Name: labels, dtype: int64

7、查看矫正后的准确率

accu_ma=accuracy_score(y,y_new)
accu_ma

0.997

8、将矫正后的结果可视化

1、先将数据转成numpy向量或者pandas的Series

y_new=np.array(y_new)
y_new

array([0, 0, 0, ..., 1, 1, 1])

2、可视化矫正后的结果和原始数据结果对比图

fig8=plt.figure(figsize=(20,7))
plt.subplot(121)
label0=plt.scatter(x1[y==0],x2[y==0])
label1=plt.scatter(x1[y==1],x2[y==1])
label2=plt.scatter(x1[y==2],x2[y==2])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('label data')
plt.xlabel('V1')
plt.ylabel('V2')plt.subplot(122)
label0=plt.scatter(x1[y_new==0],x2[y_new==0])
label1=plt.scatter(x1[y_new==1],x2[y_new==1])
label2=plt.scatter(x1[y_new==2],x2[y_new==2])
plt.scatter(center2[:,0],center2[:,1])
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.title('meanshift data')
plt.xlabel('V1')
plt.ylabel('V2')
plt.show()

总结

1、KMean算法、KNN算法、MeanShift算法是解决分类问题的算法

2、KMean算法里面建模的时候random_state代表随机种子值,只要选定一个数字,哪怕是0,下次重新运行的时候结果是固定不变的,但是当赋值为None或者不赋值的时候,每次都会随机分配数据,有可能结果的标签数值【0,1,2】会来回变动。但这个算法里生成的中心点始终是不变的。

3、KMean算法是无监督学习算法,需要给定分类的个数,训练数据只需有X,根据数据自己生成标签,所以跟初始的标签可能不同,矫正结果后,可以看到分类的准确在这次的数据中还是挺高的。

4、KMean需要指定分类的数量。

5、KNN算法是有监督的学习算法,训练数据有X和y标签。

6、MeanShift算法是无监督学习算法,训练数据只需有X,需要计算出带宽(区域半径)R,可以不指定分类的个数。

7、MeanShift算法指定的带宽不一样,得到的结果也会有差别,中心点也会有变动。

人工智能:第四章 机器学习之聚类相关推荐

  1. 图解机器学习第四部分第十四章——K均值聚类算法

    n = 300; c = 3; % 聚成三类 t = randperm(n); % 将一列序号随机打乱 x = [randn(1,n/3)-2 randn(1,n/3) randn(1,n/3)+2; ...

  2. 统计学习方法第十四章作业:聚类—层次聚类聚合/分裂算法、K_means聚类算法 代码实现

    层次聚类聚合/分裂算法 import numpy as np import copy import matplotlib.pyplot as pltclass Hierarchical_cluster ...

  3. 人工智能第四章第四丶五和六节知识总结

    4.4归结演绎推理 (1)子句集及其简化 子句和子句集 ①原子谓词公式及其否定统称为文字.      例如,P(x).Q(x).﹁ P(x).﹁ Q(x)等都是文字 ②任何文字的析取式称为子句     ...

  4. 《Python深度学习》第四章读书笔记

    第四章 机器学习基础 本章重点:处理机器学习问题的通用工作流程: 定义问题与要训练的数据. 收集这些数据,有需要的话用标签来标注数据. 选择衡量问题成功的指标. 你要在验证数据上监控哪些指标? 确定评 ...

  5. 人工智能:第七章 机器学习

    第七章机器学习 教学内容:机器学习是继专家系统之后人工智能应用的又一重要研究领域.本章主要介绍机器学习的有关知识及其主要的几种学习方法,并介绍了知识发现的相关内容. 教学重点:机器学习的基本结构.类比 ...

  6. [Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. C#,人工智能,机器学习,聚类算法,训练数据集生成算法、软件与源代码

    摘要:本文简述了人工智能的重要分支--机器学习的核心算法之一--聚类算法,并用C#实现了一套完全交互式的.可由用户自由发挥的,适用于聚类算法的训练数据集生成软件--Clustering.用户使用鼠标左 ...

  8. 人工智能:第四章 计算智能(1)

    第四章 计算智能(1) 教学内容:本章讨论计算智能所涉及的领域和范围,计算智能的含义及它与传统的人工智能的区别.介绍人工神经网络的由来.特性.结构.模型和算法:神经网络的表示和推理.简要地介绍模糊数学 ...

  9. 机器学习实战 基于_机器学习实战:基于Scikit-Learn和TensorFlow—第四章笔记

    机器学习实战:基于Scikit-Learn和TensorFlow---第四章笔记 一.学习目标 之前用了那么多的机器学习的模型,但是它们各自的训练算法在很大程度上还是一个黑匣子,我们对对系统内部的实现 ...

最新文章

  1. ceph pool 相关命令
  2. Centos7 设置DNS 服务器
  3. 数据结构7.5_有向无环图及其应用
  4. java httpinvoker漏洞_Spring HttpInvoker 服务端安全验证的和客户端请求配置
  5. 浏览Github必备的5款神器级别的Chrome插件
  6. 组装简历必备的9大要件
  7. 20175212童皓桢 Java实验二-面向对象程序设计实验报告
  8. ACCESS的System.Data.OleDb.OleDbException: INSERT INTO 语句的语法错误
  9. 关于.NET框架的主要组件 10:45:02
  10. 中科罗伯特机器人吧_延庆旧县南站附近继续教育
  11. php定位符,浅析PHP正则表达式定位字符
  12. 导致溢出_邯郸一司机,溢出的“5毫克”导致A2被降级,老司机自吞“苦酒”
  13. Android项目:通过ant重新打包proguard混淆器jar文件
  14. H3C新华三笔记本FN键锁定
  15. openmv和stm32串口通信完成二维码识别
  16. 英语专业,不想做老师,还能做什么工作?
  17. css3 书页卷脚_css3实现的书本立体翻页效果代码实例
  18. Java匹马行天下之一顿操作猛如虎,框架作用知多少?
  19. 十大领域五大过程组(上):你必须了解的项目管理常识
  20. 微信小程序输入框input

热门文章

  1. leetcode(js)-每日一练之 矩阵置零 题库编号 73
  2. 卸载AVG(Antivirus Free)的一个途径 Windows
  3. 纸球的40种折法_怎么做纸球的折法步骤图解
  4. html 5学什么软件,从头再学html5
  5. JAVA英文翻译表--IT术语中英对照
  6. Python(二)字符串和文本
  7. Linux 的 IO 通信 以及 Reactor 线程模型浅析
  8. 在 Overleaf 中使用 ployglossia 和 fontspec 来进行多语言输入
  9. 第三章 用信息集成的观念理解MRP到MRPII
  10. 一起走进系统集成,了解自动化计量软件