python机器学习(1:K_means聚类算法)
一、算法介绍
K-means算法是最简单的也是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。算法的目的是使各个样本与所在均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准)
这里小编给大家推荐两个不错的学习链接:
二、算法步骤解析
- 从平面中随机选取K个点作为初始聚类中心,我们的目的是将给定的所有点集分成K类:
- 计算每个点到初始聚类中心的距离,并选择距离最近的归为其类;
- 所有点归完类后,计算每一类的质心,并求出每一类的质心与上一级的聚类中心的偏移量是否都小于给定的阈值(临界值);
- 若不满足则将求出的质心取代上一级聚类中心并迭代(循环)二三步骤,直到满足条件,迭代终止;
三、代码实践
- 代码中我们用正太分布来随机取点,最后一图的形式直观显示给大家看,所以我们需先引入一些模块;
import numpy
import random
import pylab as pl
- 为求两点间距,定义一个函数;
def cal_distance(a, b): #计算两点的距离
return (a[0]- b[0]) ** 2 + (a[1] - b[1]) **2
- 我们给出三个正太分布的数据,各200个,并用列表a,b来存放;
x1 = numpy.round(numpy.random.normal(115, 10, 200),2)
y1 = numpy.round(numpy.random.normal(95, 4,200),2)
x2 = numpy.round(numpy.random.normal(100, 10, 200),2)
y2 = numpy.round(numpy.random.normal(70, 3, 200),2)
x3 = numpy.round(numpy.random.normal(150,9 , 200),2)
y3 = numpy.round(numpy.random.normal(72, 4, 200),2)
a = []
b = []
for i in range(200):
a.append(x1[i])
b.append(y1[i])
for i in range(200):
a.append(x2[i])
b.append(y2[i])
for i in range(200):
a.append(x3[i])
b.append(y3[i])
- 我们先来直观看看未分类的图像是什么样的;
pl.figure(1)
pl.plot(a,b,'o')
pl.title('the initial map')
- 按照我们说的十四字步骤,我们的代码如下;
k1 = [ random.randint(85,145) for _ in range(2)] #任选三个为聚类中心
k2 = [ random.randint(70,150) for _ in range(2)]
k3 = [ random.randint(50,150) for _ in range(2)]
clu_k1 = [] #划分三个聚类
clu_k2 = []
clu_k3 = []
while True:
clu_k1 = []
clu_k2 = []
clu_k3 = []
for i in range(600):
ab_distance1 = cal_distance(k1, [a[i], b[i]])
ab_distance2 = cal_distance(k2, [a[i], b[i]]) #计算每个样本到聚类中心的距离
ab_distance3 = cal_distance(k3, [a[i], b[i]])
if (ab_distance1 <= ab_distance2 and ab_distance1 <= ab_distance3):
clu_k1.append(i)
elif (ab_distance2 <= ab_distance1 and ab_distance2 <= ab_distance3):
clu_k2.append(i) #每个样本归于更近的聚类中心
elif (ab_distance3 <= ab_distance1 and ab_distance3 <= ab_distance2):
clu_k3.append(i)
k1_x = sum([a[i] for i in clu_k1]) / len(clu_k1) #每类样本计算质心并使之成为新的聚类中心
k1_y = sum([b[i] for i in clu_k1]) / len(clu_k1)
k2_x = sum([a[i] for i in clu_k2]) / len(clu_k2)
k2_y = sum([b[i] for i in clu_k2]) / len(clu_k2)
k3_x = sum([a[i] for i in clu_k3]) / len(clu_k3)
k3_y = sum([b[i] for i in clu_k3]) / len(clu_k3)
k1_dis=cal_distance(k1, [k1_x, k1_y])
k2_dis=cal_distance(k2, [k2_x, k2_y])
k3_dis=cal_distance(k3, [k3_x, k3_y])
if k1_dis>0.1 or k2_dis>0.1 or k3_dis>0.1: #判断新聚类中心与上一个聚类中心的偏移量是否为0
k1 = [k1_x, k1_y]
k2 = [k2_x, k2_y]
k3 = [k3_x, k3_y] #偏移量大于0.1,则求出的质心取代原来的聚类中心
else:
break #偏移量小于等于0.1,迭代终止
kv1_x = [a[i] for i in clu_k1] #迭代终止后将同一类的点x,y分别以列表形式存放
kv1_y = [b[i] for i in clu_k1]
kv2_x = [a[i] for i in clu_k2]
kv2_y = [b[i] for i in clu_k2]
kv3_x = [a[i] for i in clu_k3]
kv3_y = [b[i] for i in clu_k3]
- 完成迭代后,我们再以图的形式直观显示出来
pl.figure(2)
pl.title('the altered map')
pl.plot(kv1_x,kv1_y,'*')
pl.plot(kv2_x,kv2_y,'s')
pl.plot(kv3_x,kv3_y,'o')
pl.xlabel('X')
pl.ylabel('Y')
pl.show()
- 上面所举的代码中,k=3,如果我们设k=4,5,6….,结果会有挺大的不同;
- 对k个初始质心的选择是随机的,容易陷入局部最小值;
- 数据库比较大的时候,收敛会比较慢;
- 不是所有的数据分布都能搞定;
python机器学习(1:K_means聚类算法)的更多相关文章
- 【Python机器学习实战】聚类算法(1)——K-Means聚类
实战部分主要针对某一具体算法对其原理进行较为详细的介绍,然后进行简单地实现(可能对算法性能考虑欠缺),这一部分主要介绍一些常见的一些聚类算法. K-means聚类算法 0.聚类算法算法简介 聚类算法算 ...
- 【Python机器学习实战】聚类算法(2)——层次聚类(HAC)和DBSCAN
层次聚类和DBSCAN 前面说到K-means聚类算法,K-Means聚类是一种分散性聚类算法,本节主要是基于数据结构的聚类算法--层次聚类和基于密度的聚类算法--DBSCAN两种算法. 1.层次聚类 ...
- Python实现 K_Means聚类算法
使用 Python实现 K_Means聚类算法: 问题定义 聚类问题是数据挖掘的基本问题,它的本质是将n个数据对象划分为 k个聚类,以便使得所获得的聚类满足以下条件: 同一聚类中的数据对象相似度较高 ...
- python机器学习笔记:EM算法
EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断算法等等.本文对于E ...
- 机器学习六--K-means聚类算法
机器学习六--K-means聚类算法 想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别 ...
- Python机器学习笔记 K-近邻算法
K近邻(KNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一. 所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表.KNN算法的 ...
- 机器学习sklearn19.0聚类算法——Kmeans算法
一.关于聚类及相似度.距离的知识点 二.k-means算法思想与流程 三.sklearn中对于kmeans算法的参数 四.代码示例以及应用的知识点简介 (1)make_blobs:聚类数据生成器 sk ...
- 机器学习:K-Means聚类算法
本文来自同步博客. 前面几篇文章介绍了回归或分类的几个算法,它们的共同点是训练数据包含了输出结果,要求算法能够通过训练数据掌握规律,用于预测新输入数据的输出值.因此,回归算法或分类算法被称之为监督学习 ...
- Python机器学习笔记:K-Means算法,DBSCAN算法
K-Means算法 K-Means 算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means 算法有大量的变体,本文就从最传统的K-Means算法学起,在其基础上学习 ...
随机推荐
- sudo 提权漏洞(CVE-2019-14287)复现 (10.16 第二十二天)
sudo是Linux系统命令,让普通账号以root身份去执行某些命令,比,安装软件.查看某些配置文件.关机.重启等操作,如果普通账号需要使用sudo需要修改配置文件/etc/sudoers,将sudo ...
- 编程入门-Eclipse项目导出和导入
编程入门-Eclipse项目导出和导入 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.导出项目 1>.如下图所示,在项目目录上右击鼠标,依次点击"Export& ...
- pythpon--类操作
#coding=utf-8import numpy as npimport tensorflow as tfimport osos.environ["CUDA_VISIBLE_DEVICES ...
- Egret Engine 2D - 显示对象
alpha:透明度 width:宽度 height:高度 rotation:旋转角度 scaleX:横向缩放 scaleY:纵向缩放 skewX:横向斜切 skewY:纵向斜切 visible ...
- C语言预处理理论-宏定义2
宏定义21.带参宏和带参函数的区别(1)宏定义是在预处理期间处理的,而函数是在编译期间处理的.这个区别带来的实质差异是:宏定义最终是在调用宏的地方把宏体原地展开,而函数是在调用函数处跳转到函数中去执行 ...
- 大数据高可用集群环境安装与配置(10)——安装Kafka高可用集群
1. 获取安装包下载链接 访问https://kafka.apache.org/downloads 找到kafka对应版本 需要与服务器安装的scala版本一致(运行spark-shell可以看到当前 ...
- SpringBoot学习(四)——配置文件占位符
RandomValuePropertySource:配置文件中可以使用随机数 ${Random.value} ${random.int}, ${random.long}, ${random.int( ...
- 吴裕雄--天生自然 PHP开发学习:运算符
<?php $x=10; $y=6; echo ($x + $y); // 输出16 echo '<br>'; // 换行 echo ($x - $y); // 输出4 echo ' ...
- 在Linux下 MySQL错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 解决办法【很管用】
一般这个错误是由密码错误引起,解决的办法自然就是重置密码. 假设我们使用的是root账户. 1.重置密码的第一步就是跳过MySQL的密码认证过程,方法如下: #vim /etc/my.cnf(注:wi ...
- 18 12 4 SQL 的基本 语法
数据库的基本语法 -- 数据库的操作 -- 链接数据库 mysql -uroot -p mysql -uroot -pmysql -- 退出数据库 exit/quit/ctrl+d -- sql语句最 ...