二分K-mean均值算法原理讲解和代码实战

二分K-mean均值算法原理讲解和代码实战

前言

上一篇我们简单给大家介绍了一下K-mean均值的原理和详细代码实践。由于普通的K-mean均值算法很容易陷入局部最优解的情况,这一篇,给大家介绍一个在前面的基础上的优化算法,能够很好的解决陷入局部最优解的情况。

GitHub地址:二分K-mean算法实战

K-mean算法回顾:K-mean均值算法原理讲解和代码实战

二分K-mean均值算法原理解析

K-mean局限性分析

在我们写完上一节的K-mean算法后,我们可以会惊讶于算法实现方式的简单和效果的强大,但是也同样存在这样的问题,咱们看下面一张图:
在这里插入图片描述
图1 该图片来自《机器学习实战》

从这个图中,我们可以看到,图中的数据分为了三类,但是这样的分类明显不是一个好的分类。好的分类应该是上面三组数据各属于一类,比如下图:

在这里插入图片描述
图2 该图片来自《机器学习实战》

是什么原因造成出现第图1的情况呢?

是因为K-mean是采用随机初始化K点的方法,所以极有可能由于初始化点的位置,导致出现图1的情况

目前比较好的解决办法:

  1. 运行多次K-mean算法,取使得损失值最小的K点。(数据量比较小的时候效果比较好)
  2. 二分K-mean均值 -这个方法很好的解决了这个问题,下面重点讲解

二分K-mean均值原理

  1. 首先我们将整个数据集当成一簇,取当前所有数据点的均值作为这个簇的点坐标
  2. 对该簇使用K-mean进行二分类,计算分类后损失值(也就是数据点距所属簇的欧几里得距离)的大小。选取使得误差最小的那个簇进行划分。
  3. 不断循环2,直到当前族的个数等于K值。

伪代码(摘抄《机器学习实战》):

	将所有点看成一个簇

​	当簇数目小于K时

​			对于每一个簇

​					计算总误差

​					在给定的簇上面进行K-mean均值聚类(k=2)

​					计算将该簇一分为二之后的总误差

​			选择使得误差最小的那个簇进行划分操作

二分K-mean均值算法代码实战

一、生成数据

def CreatData():
    x1 = np.random.rand(50)*3#0-3
    y1 = [i+np.random.rand()*2-1 for i in x1]
    with open('data.txt','w') as f:
        for i in range(len(x1)):
            f.write(str(x1[i])+'\t'+str(y1[i])+'\n')

二、读取数据

def loadDateSet(fileName):
    dataMat=[]
    fr = open(fileName)
    for line in fr.readlines():
        curline = line.strip().split('\t')
        #map函数 对指定的序列做映射,第一个参数是function 第二个是序列
        #此方法可以理解为进行字符串格式转换.这个函数可以深究
        fltLine = map(float,curline)
        dataMat.append(list(fltLine))
    return dataMat

这里主要是说一下map这个方法

map(function,list) 此方法的作用是将第二个参数(列表或者迭代器)对前面的方法进行一一映射。

举个例子:

>>>def square(x) :            # 计算平方数
...     return x ** 2
... 
>>> map(square, [1,2,3,4,5])   # 计算列表各个元素的平方
[1, 4, 9, 16, 
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值