专栏首页毛利学Python机器学习认识聚类(KMeans算法)

机器学习认识聚类(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.ydata_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份计算模型的误差平方和

本文分享自微信公众号 - Python之王(gh_70a22bfa8e3a),作者:毛利

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python迭代器和生成器

    比如:列表[0,1,2],元组(1,2,3),字典{’0:'0','1':"1'} 集合{1,2,3}都是容器

    润森
  • 机器学习之逻辑回归

    文中的所有数据集链接:https://pan.baidu.com/s/1TV4RQseo6bVd9xKJdmsNFw

    润森
  • 数据科学篇| statsmodels库的使用(六)

    statsmodels是一个Python模块,它提供对许多不同统计模型估计的类和函数,并且可以进行统计测试和统计数据的探索。

    润森
  • python 数据分析工具包 pandas(一)

    pandas 是专为 python 编程语言设计的高性能,简单易用的数据结构和数据分析工具库,它建立在 numpy 之上,可以许多第三方库完美集成在同一个科学计...

    我是一条小青蛇
  • 山东青州“抗疫”实录:7天完成智慧校园升级

    ? 新冠病毒疫情的突袭,给教育行业带来了巨大的挑战:全国大中小学集体从线下“搬迁”到线上,且时间紧、任务重。然而,在如此重压之下,山东省青州市还主动给自己增加...

    鹅老师
  • python-selenum3 第六天

    1.循环遍历所有的下拉列表值 2.单选下拉列表 3.多选择列表的选中与取消 4.操作单选框、多选框以及断言及全部选中 5.断言页面源码中的关键字 6.截屏 7....

    py3study
  • FPGA 高手养成记-Test bench文件结构一览无余

    Verilog测试平台是一个例化的待测(MUT)模块,重要的是给它施加激励并观测其输出。逻辑模块与其对应的测试平台共同组成仿真模型,应用这个模型可以测试...

    碎碎思
  • MySQL 的一次错误处理 Got fatal error 1236 from master when reading data from binary log

    mysql 5.5.28-log> show slave status\G *************************** 1. row ******...

    拓荒者
  • 详解Linux如何生成随机数字和字符串

    /dev/random存储着系统当前运行环境的实时数据,是阻塞的随机数发生器,读取有时需要等待,尽量避免使用。

    砸漏
  • mysql锁机制总结,以及优化建议

    偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

    李红

扫码关注云+社区

领取腾讯云代金券