海西网站建设哪家好,app开发定制外包22,学校网站群建设设计,和平网站建设公司K-MEANS 算法的简单实现 目的是为了自己熟悉 K 均值的过程 思路#xff1a;
如何写一个 KMEANS 算法呢 我们就做一个最简单的#xff0c;所有的数据都是点#xff0c;也就是只有横纵坐标。 数据的格式我们用一个数组来进行表示#xff0c;数组有两个值#xff0c;一个是 …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 0while True :if step ! 0 : # 这里就是第二步重新计算中心点如果中心点一致那么就退出迭代old_centers copy.deepcopy(centers)centers []for key,value in result[step-1].items():sum 0x_avg 0for i in value[0]:sum ix_avg sum / len(value[0])sum 0y_avg 0for i in value[1]:sum iy_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 :breakcategories {}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, keytemp.get)value categories[min_value_key]value[0].append(X[i])value[1].append(Y[i])categories[min_value_key] valueresult.append(categories)step 1print(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],ccolor)step1plt.show()