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

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

前言

最近在学习吴恩达机器学习课程,刚刚学完第一个无监督学习算法,搭配着机器学习实战里面的k-mean实战,成功的将理论和实际结合了起来。接下来,咱们简单的分析算法原理之后,着重讲解一下源代码。

项目github地址:K-mean算法实战

K-mean算法原理解析

K表示的是组的个数,也就是你想把这些数据分成几类。

算法主要思路:

  1. 随机选择k个点,作为聚类的中心点
  2. 将所有数据进行归类,归类标准是按照欧几里得距离,数据离哪个中心点近,就属于哪一类
  3. 移动聚类点。计算属于该中心点的数据的平均值,将聚类点移动到平均值位置
  4. 不断重复2、3,直到数据的归类不再发生变化

图形过程演示:

我使用了数据量是50,然后K值设定的是2,也就是分为两类

下面咱们看一下这个动图(文末有生成动图python代码地址):

在这里插入图片描述

接下来给大家解析一下:

  1. 下图是随机初始化的两个K点,当然这个初始化是的范围是在数据点的范围之内

在这里插入图片描述

  1. 下图开始进行2、3步的循环:

在这里插入图片描述

  1. 直到数据归属不发生改变,则判定为当前K点为最佳值。数据归属是根据各个数据点距K点的距离判定的,使用的方法是欧几里得距离公式。
    在这里插入图片描述

代码解析

一、生成数据

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, 25]

map(float,curline) 的作用可以理解为将curline 列表中的数字格式转换成float类型的。

三、欧几里得距离计算

def distEclud(vecA,vecB):
    return np.sqrt(np.sum(np.power((vecA-vecB),2)))

四、显示变化数据变化过程

def showProcess(clusterAssment,centroids):
    #显示过程
    Index1 = np.nonzero(clusterAssment[:,0]==0)[0]
    Index2 = []
    for i in range
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值