好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

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

◆ ◆ ◆  ◆ ◆

什么是聚类

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

◆ ◆ ◆  ◆ ◆

什么是K均值聚类算法

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

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

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

◆ ◆ ◆  ◆ ◆

实例解释

先生成100个坐标作为数据,再分为2类,简单运用了K均值聚类算法
 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均值聚类算法

 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分开出来  

◆ ◆ ◆  ◆ ◆

模型的评价

 from sklearn import metrics metrics.calinski_harabaz_score(data, y_pred) # 690.8014552883992 数值比较大 

◆ ◆ ◆  ◆ ◆

实战训练

小麦种子数据集的介绍

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

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

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

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

 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份

 y_pred = KMeans(n_clusters=3).fit_predict(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']]) y_pred  

y_pred的数据

 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]) 

 y_pre = pd.Series(y_pred)  #将y_pred转化成series对象 y_pre  #这是我们预测的值  
 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 …………………………  #后面还有数据  
 # 实际的值 data_p  
 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  

 # 在预测值中 0,1,2 代表的是分类的号码,而实际值中 分为1,2,3  # 在这里预测值 0 对应的实际值的 1 # 在这里预测值 1 对应的实际值的 3 y_pre = y_pre.map({0:1,1:3}) #采用map方法  

 # 新建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.y  data_p # 打印data_p 

 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  #还有好多 

 

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

 data_p.acc.sum()/len(data_p) # ouput:0.2857142857142857  

 # 计算模型的好坏 metrics.calinski_harabaz_score(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']], y_pred) # ouput:375.8049613895007  

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

 y_pred = KMeans(n_clusters=4).fit_predict(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']]) metrics.calinski_harabaz_score(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']], y_pred) ouput :327.85531301878575 y_pred = KMeans(n_clusters=5).fit_predict(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']]) metrics.calinski_harabaz_score(data[['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7']], y_pred) ouput :310.2182173885204 可见没有分为3类的好 

◆ ◆ ◆  ◆ ◆

赶快来分享关注吖

查看更多关于机器学习认识聚类(KMeans算法)的详细内容...

  阅读:38次