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算法学起,在其基础上学习 ...
随机推荐
- 【转载】使用driver.findElement(By.id("txtPhoneNum")).getText();获取文本
今天在写自动化测试脚本的时候要获取一个输入框中的文本写了如下脚本: getAndSwitch("http://cas.minshengnet.com:14080/register/eRegi ...
- Redis的安装并配置快捷启动
Redis 安装 1.下载 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 2.解压 tar -zxvf redis-5.0.5.t ...
- UVA - 12118 Inspector's Dilemma(检查员的难题)(欧拉回路)
题意:有一个n个点的无向完全图,找一条最短路(起点终点任意),使得该道路经过E条指定的边. 分析: 1.因为要使走过的路最短,所以每个指定的边最好只走一遍,所以是欧拉道路. 2.若当前连通的道路不是欧 ...
- JavaSE--日志
参考 https://www.cnblogs.com/hanszhao/p/9754419.html https://www.cnblogs.com/chenhongliang/p/5312517.h ...
- 【pwnable.kr】coin1
pwnable从入门到放弃又一发 说是一道pwnable,其实是一道coding... nc pwnable.kr 9007 连接上看看,玩硬币? 老子是来拿flag的,谁来哄孩子来了!!! 算了,f ...
- Day2-T4
原题目 当然这是原题+,要输路径的.所以必须DFS. Describe:DP or DFS code: #include<bits/stdc++.h> using namespace st ...
- 关于boostrap的TAB切换 ,如何获取?
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) { // 获取已激活的标签页的名称 var acti ...
- 一文说透 Spring 循环依赖问题
https://zhuanlan.zhihu.com/p/62382615 循环依赖发生的时机 Bean 实例化主要分为三步,如图: 问题出现在:第一步和第二步的过程中,也就是填充属性 / 方法的过程 ...
- 基于图灵api的Python机器人
一.注册图灵机器人 先注册并登录图灵机器人官网: 点击创建机器人 复制机器人的key 二.搭建Python机器人 Python版本:3.6 注意替换第三行代码的apikey import reques ...
- Z0J 3772 Calculate the Function 线段树+矩阵
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5235 这种题目居然没想到,一开始往矩阵快速幂想去了,因为之前跪了太多矩阵快速幂 ...