前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习认识聚类(KMeans算法)

机器学习认识聚类(KMeans算法)

作者头像
润森
发布2019-08-29 10:14:55
8570
发布2019-08-29 10:14:55
举报
文章被收录于专栏:毛利学Python毛利学Python

导读:机器是怎样学习的,都学到了什么?人类又是怎样教会机器学习的?本文通过案例给你讲清楚各类算法的原理和应用。

机器学习,一言以蔽之就是人类定义一定的计算机算法,让计算机根据输入的样本和一些人类的干预来总结和归纳其特征和特点,并用这些特征和特点和一定的学习目标形成映射关系,进而自动化地做出相应反应的过程。这个反应可能是做出相应的标记或判断,也可能是输出一段内容——图片、程序代码、文本、声音,而机器自己学到的内容我们可以描述为一个函数、一段程序、一组策略等相对复杂的关系描述。

◆ ◆ ◆ ◆ ◆

什么是聚类

聚类是数据挖掘中的概念,就是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。

◆ ◆ ◆ ◆ ◆

什么是K均值聚类算法

K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。一旦全部对象都被分配了,每个聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

如果用数据表达式表示,假设簇划分为(C1,C2,...Ck)(C1,C2,...Ck),则我们的目标是最小化平方误差E

◆ ◆ ◆ ◆ ◆

实例解释

代码语言:javascript
复制
先生成100个坐标作为数据,再分为2类,简单运用了K均值聚类算法
代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
data1 = pd.DataFrame({'X':np.random.randint(1,50,100),'Y':np.random.randint(1,50,100)})
data = pd.concat([data1 + 50, data1])
plt.style.use('ggplot')
plt.scatter(data.X, data.Y)

得到两个明显不同的数据

◆ ◆ ◆ ◆ ◆

使用K均值聚类算法

代码语言:javascript
复制
from sklearn.cluster import KMeans #导入kmeans算法
y_pred = KMeans(n_clusters=2).fit_predict(data)  #预测分为2类,用data数据去训练模型
plt.scatter(data.X, data.Y, c = y_pred) #用color分开出来

◆ ◆ ◆ ◆ ◆

模型的评价

代码语言:javascript
复制
from sklearn import metrics
metrics.calinski_harabaz_score(data, y_pred) # 690.8014552883992 数值比较大

◆ ◆ ◆ ◆ ◆

实战训练

小麦种子数据集的介绍

小麦种子数据集(Wheat Seeds Dataset)涉及对不同品种的小麦种子进行预测,给定的是种子的计量数据。

它是一个二元分类问题。每个类的观察值是均等的,一共 210 个观察值,7个输入变量和1个输出变量。

变量名如下: 区域 周长 压实度 籽粒长度 籽粒宽度 不对称系数 籽粒腹沟长度 类(1,2,3)

打开小麦种子数据集的txt文件

代码语言:javascript
复制
data = pd.read_csv('seeds_dataset.txt',header=None, delim_whitespace=True, names=['x1','x2','x3','x4','x5','x6','x7','y'])
data.head()

使用kmean算法将数据分为3份

代码语言:javascript
复制
y_pred = KMeans(n_clusters=3).fit_predict(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']])
y_pred

y_pred的数据

代码语言:javascript
复制
ouput:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,
       0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
       0, 0, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2,
       0, 0, 0, 0, 2, 0, 0, 0, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1])
代码语言:javascript
复制
y_pre = pd.Series(y_pred)  #将y_pred转化成series对象
y_pre  #这是我们预测的值
代码语言:javascript
复制
ouput:
0      0
1      0
2      0
3      0
4      0
5      0
6      0
7      0
8      0
9      0
10     0
11     0
12     0
13     0
…………………………  #后面还有数据
代码语言:javascript
复制
# 实际的值
data_p
代码语言:javascript
复制
ouput:
0      1
1      1
2      1
3      1
4      1
5      1
6      1
7      1
8      1
9      1
10     1
11     1
12     1
13     1
14     1
15     1
代码语言:javascript
复制
# 在预测值中 0,1,2 代表的是分类的号码,而实际值中 分为1,2,3 
# 在这里预测值 0 对应的实际值的 1
# 在这里预测值 1 对应的实际值的 3
y_pre = y_pre.map({0:1,1:3}) #采用map方法
代码语言:javascript
复制
# 新建dataframe  y_pre 预测值 y_actual实际值
data_p = pd.DataFrame({'y_pre ':y_pre ,'y_actual':data.y})
# 在dataframe中  创建一个acc 表示 true or false 
# 如果 data_p.y_pre == data_p.y_actual 返回true
data_p['acc'] =  data_p.y_pre == data_p.ydata_p # 打印data_p
代码语言:javascript
复制
output:
    y_pre   y_actual acc
0    1.0    1    True
1    1.0    1    True
2    1.0    1    True
3    1.0    1    True
4    1.0    1    True
5    1.0    1    True
6    1.0    1    True
7    1.0    1    True
8    1.0    1    True
9    1.0    1    True
10    1.0    1    True
11    1.0    1    True
12    1.0    1    True
13    1.0    1    True
14    1.0    1    True  #还有好多

对布尔值进行求和/实际数量

代码语言:javascript
复制
data_p.acc.sum()/len(data_p)
# ouput:0.2857142857142857
代码语言:javascript
复制
# 计算模型的好坏
metrics.calinski_harabaz_score(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']], y_pred)
# ouput:375.8049613895007

当然这是官方分为3份,我们也可以尝试分为2份,4份计算模型的误差平方和

代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 小麦种子数据集的介绍
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档