K-Means聚类

print('-------------两簇----------------')

import time
import random
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt

def plot():
	plt.subplot(111),plt.plot(area_1[:,0],area_1[:,1],'r.'),plt.plot(area_2[:,0],area_2[:,1],'b.')
	plt.plot(Mean_1[0],Mean_1[1],'bo'),plt.plot(Mean_2[0],Mean_2[1],'ro')
	plt.show()



A = pd.read_table('聚类.txt',header=None)
x = np.array(A.iloc[:,0:2])

Mean_1 = random.choice(x)
Mean_2 = random.choice(x)
while (Mean_1[0]==Mean_2[0] or Mean_1[1]==Mean_2[1]):
	Mean_2 = random.choice(x)
	print('重选中心')

# 向量方法 没全好
# l_m1 = (Mean_1-x)[:,0:1]**2+(Mean_1-x)[:,1:2]**2  #计算各点到l1的欧式距离
# l_m2 = (Mean_2-x)[:,0:1]**2+(Mean_2-x)[:,1:2]**2  #计算各点到l2的欧式距离
# print(l_m1-l_m2)
# area_1 = x[l_m1<=l_m2]

for j in range(10):
	area_1=[]
	area_2=[]
	for i,v in enumerate(x):
		if ( ( (Mean_1[0]-v[0])**2 + (Mean_1[1]-v[1])**2) <= ( (Mean_2[0]-v[0])**2 + (Mean_2[1]-v[1])**2)):
			area_1.append(v)
		else:
			area_2.append(v)
	area_1=np.array(area_1)
	area_2=np.array(area_2)

	if j%2==0:
		plot()

	# 重新确定中心
	Mean_1 = [np.mean(area_1[0]),np.mean(area_1[1])]
	Mean_2 = [np.mean(area_2[0]),np.mean(area_2[1])]






print('---------------------三个簇------------------------------')

import time
import random
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt

A = pd.read_table('聚类.txt',header=None)
X = np.array(A)
K = 3
m,n = X.shape
# 随机选取K个中心centra
CENTRA=np.array(random.sample(list(X),K))

for decen in range(7):

	# 构造距离矩阵
	DISTANCE=np.ones((m,K))
	for k in range(K):
		DISTANCE[:,k]=np.dot((X-CENTRA[k])**2,np.ones((n,1)))[:,0]
		
	AREA_0=[]
	AREA_1=[]
	AREA_2=[]
	for m_i,v in enumerate(DISTANCE):
		ind = list(v).index(min(v))
		if (ind==0):
			AREA_0.append(X[m_i,:])		
		if (ind==1):
			AREA_1.append(X[m_i,:])		
		if (ind==2):
			AREA_2.append(X[m_i,:])		


	AREA_0 = np.array(AREA_0)
	AREA_1 = np.array(AREA_1)
	AREA_2 = np.array(AREA_2)


	plt.plot(AREA_0[:,0],AREA_0[:,1],'gx'),	plt.plot(AREA_1[:,0],AREA_1[:,1],'g+'),	plt.plot(AREA_2[:,0],AREA_2[:,1],'g.')
	plt.plot(CENTRA[0,0],CENTRA[0,1],'ro'),	plt.plot(CENTRA[1,0],CENTRA[1,1],'ro'),	plt.plot(CENTRA[2,0],CENTRA[2,1],'ro')

	if decen%1==0:
		plt.show()


		# 重新确定中心
	CENTRA[0,:] = [np.mean(AREA_0[:,0]),np.mean(AREA_0[:,1])]
	CENTRA[1,:] = [np.mean(AREA_1[:,0]),np.mean(AREA_1[:,1])]
	CENTRA[2,:] = [np.mean(AREA_2[:,0]),np.mean(AREA_2[:,1])]

	print(CENTRA)


两簇的聚类情况:

第1,2次迭代


第3 4 次迭代:


然后迭代中心收敛




三簇的情况:

第1次迭代:


第2次迭代:


第3次迭代:


第4次迭代:


第5次迭代:



第6次迭代:



第7次迭代:(收敛)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值