机器学习入门之k-means算法

k-means算法

简介

据说是机器学习中最简单的一种方法,属于非监督学习这一类。通俗一点讲,给机器一堆数据,告诉机器要分成多少种类别,然后机器就根据算法进行各种操作。

实现原理

需要我们确定变量k,即最终 的数据会有几种类别。

总共有k个中心坐标,一开始可以随机赋值,通过计算目标点坐标与所有中心坐标的距离,将其归类在距离较近的类别中。

之后根据类别中的目标点计算平均值重新得到中心坐标,再重复上面的工作。

距离公式

常用的距离公式如欧式距离,马氏距离,曼哈顿距离。

借助科学计算库可以帮我们节省一些时间。

from scipy.spatial.distance import pdist
pdist(np.array([dot[j], center[k]]), 'euclidean')#欧氏距离
小小示例

最后总是在两种分类中来回跳转,是程序写错了么。

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist

dimension = 2

# 生成多个随机点,范围[0,10)
dot_num = 100
dot = np.random.rand(dot_num,dimension)*10

# 生成多个随机中心点,范围[0,10)
center_num = 4
center = np.random.rand(center_num,dimension)*10

# 循环迭代
times = 50
for i in range(times):
    plt.clf()
    # 数据映射
    belong = np.zeros([dot_num])
    # 计算随机点与中心点的距离,将其归属于距离近的中心点
    dist = np.zeros([dot_num,center_num])
    for j in range(dot_num):
        for k in range(center_num):
            dist[j][k] = pdist(np.array([dot[j], center[k]]), 'euclidean')
        belong[j] = np.argmax(dist[j])
    # 绘图
    for j in range(center_num):
        temp_dot = []
        for k in range(dot_num):
            if(belong[k] == j):
                temp_dot.append(dot[k])
        # 根据随机点求取均值,得出新的中心点
        if(len(temp_dot) != 0):
            temp_dot = np.array(temp_dot)
            plt.scatter(temp_dot[:,0],temp_dot[:,1])
            for k in range(dimension):
                center[j][k] = np.sum(temp_dot[:,k])/len(temp_dot)
        else:
            center[j] = np.zeros([dimension])
    # print(center)
    plt.pause(1)
    # 满足迭代次数或中心点不再改变,结束命令
说明

上述代码为动态实时更新画板内容,其中的关键代码如下

import matplotlib.pyplot as plt
for i in range(5):
    # 清除画布
    plt.clf()
    # 绘制散点
    plt.scatter(temp_dot[:,0],temp_dot[:,1])
    # 暂停间隔
    plt.pause(1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值