K-means算法

K-means算法

1.k-means算法概述

k-means算法是输入聚类个数k,以及包含n个数据对象的数据库,输出满足方差最小标准k个聚类的一种算法。k-means算法接受输入量K,然后将n个数据对象划分为k个聚类一以便使得所获得的聚类满足:同一聚类中的对象相似度较高,二不同聚类中的对象相似度较小。

2.k-means算法执行流程

(1)从n个数据对象任意选择k个对象作为初始聚类中心;

(2)根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离,并根据最小距离重新对相应对象进行划分

(3)重新计算每个(有变化)聚类的均值(中心对象)

(4)计算标准测度函数,当满足一定条件,如函数收敛时,则算法终止,如果条件不满足则回到步骤(2)。

3.k-means算法实现
import matplotlib.pyplot as plt
import numpy as np
import math
 
N = 100
x1 = np.random.normal(2,0.5,N)
y1 = np.random.normal(2,0.4,N)
plt.scatter(x1,y1,c='r',marker='o')
x2 = np.random.normal(4,0.3,N)
y2 = np.random.normal(3,0.6,N)
plt.scatter(x2,y2,c='r',marker='o')
x3 = np.random.normal(3,0.5,N)
y3 = np.random.normal(5,0.4,N)
plt.scatter(x3,y3,c='r',marker='o')
x4 = np.random.normal(1,0.3,N)
y4 = np.random.normal(4,0.6,N)
plt.scatter(x4,y4,c='r',marker='o')
plt.xlim(0,6)
plt.ylim(0,6)
plt.show()
 
x1_pre = np.random.random(1)*5
y1_pre = np.random.random(1)*5
x2_pre = np.random.random(1)*5
y2_pre = np.random.random(1)*5
x3_pre = np.random.random(1)*5
y3_pre = np.random.random(1)*5
x4_pre = np.random.random(1)*5
y4_pre = np.random.random(1)*5
 
x_data = []
for num in x1:
	x_data.append(num)
for num in x2:
	x_data.append(num)
for num in x3:
	x_data.append(num)
for num in x4:
	x_data.append(num)
y_data = []
for num in y1:
	y_data.append(num)
for num in y2:
	y_data.append(num)
for num in y3:
	y_data.append(num)
for num in y4:
	y_data.append(num)	
	
for index in range(10):
	x1 = []
	y1 = []
	x2 = []
	y2 = []
	x3 = []
	y3 = []
	x4 = []
	y4 = []
	for i in range(0,len(x_data)):
		x = x_data[i]
		y = y_data[i]
		dis1 = math.sqrt((x-x1_pre)**2+(y-y1_pre)**2)
		dis2 = math.sqrt((x-x2_pre)**2+(y-y2_pre)**2)
		dis3 = math.sqrt((x-x3_pre)**2+(y-y3_pre)**2)
		dis4 = math.sqrt((x-x4_pre)**2+(y-y4_pre)**2)
		dis_min = min(dis1,dis2,dis3,dis4)
		if dis_min==dis1:
			plt.scatter(x,y,color='b',marker='+')
			x1.append(x)
			y1.append(y)
		elif dis_min==dis2:
			plt.scatter(x,y,color='y',marker='^')
			x2.append(x)
			y2.append(y)
		elif dis_min==dis3:
			plt.scatter(x,y,color='g',marker='s')
			x3.append(x)
			y3.append(y)
		else:
			plt.scatter(x,y,color='r',marker='o')
			x4.append(x)
			y4.append(y)
	plt.show()
	x1_pre = float(sum(x1))/len(x1)
	y1_pre = float(sum(y1))/len(y1)
	x2_pre = float(sum(x2))/len(x2)
	y2_pre = float(sum(y2))/len(y2)
	x3_pre = float(sum(x3))/len(y3)
	y3_pre = float(sum(y3))/len(y3)
	x4_pre = float(sum(x4))/len(x4)
	y4_pre = float(sum(y4))/len(y4)


4 运行图

[外链图片转存失败(img-a4KNCGbt-1568646911480)(C:\Users\59287\AppData\Roaming\Typora\typora-user-images\1568645485429.png)]

5.总结

缺点:Kmeans算法当其数据点数量级较大的时候,效率比较低。

优点:易于实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值