K-MEANS 算法的简单实现

K-MEANS 算法的简单实现

目的是为了自己熟悉 K 均值的过程

思路:

如何写一个 KMEANS 算法呢
我们就做一个最简单的,所有的数据都是点,也就是只有横纵坐标。
数据的格式我们用一个数组来进行表示,数组有两个值,一个是 x 的值,另一个是 y 的值
x = [1,1,2,2,4,4,5,5]
y = [1,2,1,2,4,5,4,5]

步骤:

1. 通过要分成的类别数目随机找到中心点
2. 遍历所有根据中心点计算距离,比较距离进行分类
3. 在每一个类别中,求平均点,再次遍历所有点重新进行分类,以此往复知道类别中的数量不再变化,或者达到最大迭代步数
"""
如何写一个 KMEANS 算法呢
我们就做一个最简单的,所有的数据都是点,也就是只有横纵坐标。
数据的格式我们用一个数组来进行表示,数组有两个值,一个是 x 的值,另一个是 y 的值
x = [1,1,2,2,4,4,5,5]
y = [1,2,1,2,4,5,4,5]

步骤:
    1. 通过要分成的类别数目随机找到中心点
    2. 遍历所有根据中心点计算距离,比较距离进行分类
    3. 在每一个类别中,求平均点,再次遍历所有点重新进行分类,以此往复知道类别中的数量不再变化,或者达到最大迭代步数

"""
import copy
import math
import random
import numpy as np
x = [1, 1, 2, 2, 4, 4, 5, 5,3.5,4.5]
y = [1, 2, 1, 2, 4, 5, 4, 5,3.4,3.5]



def calc_dist(x, y):
    return math.sqrt((x[0] - x[1]) ** 2 + (y[0] - y[1]) ** 2);


def KMEANS(dots: list, category: int, max_step: int):
    # 1. 随机找个类别个中心点
    X = dots[0]
    Y = dots[1]
    dots_len = len(X)
    centers = []
    for i in range(category):
        index = random.randint(0, dots_len - 1)
        centers.append([X[index], Y[index]])
    result = [] # 记录所有迭代的次数
    # 2. 根据中心点去计算距离
    step = 0
    while True :
        if step != 0 : # 这里就是第二步,重新计算中心点,如果中心点一致,那么就退出迭代
            old_centers = copy.deepcopy(centers)
            centers = []
            for key,value in result[step-1].items():
                sum = 0
                x_avg = 0
                for i in value[0]:
                    sum += i
                x_avg = sum / len(value[0])
                sum = 0
                y_avg = 0
                for i in value[1]:
                    sum += i
                y_avg = sum / len(value[1])
                centers.append([x_avg, y_avg])
            is_same = all(set(i) == set(j) for i, j in zip(old_centers, centers))
            if is_same :
                break
        categories = {}
        for i in range(len(centers)):
            categories[str(centers[i])] = [[], []]
        for i in range(dots_len):
            temp = {}
            for j in range(len(centers)):
                temp[str(centers[j])] = calc_dist([centers[j][0], X[i]], [centers[j][1], Y[i]])
            min_value_key = min(temp, key=temp.get)
            value = categories[min_value_key]
            value[0].append(X[i])
            value[1].append(Y[i])
            categories[min_value_key] = value
        result.append(categories)
        step += 1
        print(step)
    return result[len(result)-1]


result = KMEANS([x,y],2,12)
print(result)
import matplotlib.pyplot as plt
colors = ['red', 'blue', 'green', 'orange', 'purple', 'cyan', 'magenta']
step = 0
for value in result.values():
    color = colors[step]
    print(color)
    plt.scatter(value[0],value[1],c=color)
    step+=1

plt.show()
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwhking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值