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次迭代:(收敛)