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()
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » K-MEANS 算法的简单实现
发表评论 取消回复