>> x=[0 1 0 1 2 1 2 3 6 7 8 6 7 8 9 7 8 9 8 9;0 0 1 1 1 2 2 2 6 6 6 7 7 7 7 8 8 8 9 9]; figure(1) plot(x(1,:),x(2,:),'r*') %横轴为第一行所有列,纵轴为第二行所有列,红色星号表示 %%第一步选取聚类中心,即令k=2 Z1=[x(1,1);x(2,1)]; Z2=[x(1,2);x(2,2)]; %聚类中心为z1(0,0),z2(0,1) R1=[]; R2=[]; %分为两个聚类,用于存储成员 t=1; K=1;%记录迭代的次数 dif1=inf; %inf为正无穷 dif2=inf; %%第二步计算各点与聚类中心的距离 %(inf表示最大值,eps表示最小值)只要两次聚类中心不等构成无限循环 while(dif1>eps&dif2>eps) for i=1:20 dist1=sqrt((x(1,i)-Z1(1)).^2+(x(2,i)-Z1(2)).^2); dist2=sqrt((x(1,i)-Z2(1)).^2+(x(2,i)-Z2(2)).^2); temp=[x(1,i),x(2,i)]'; if dist1<dist2 R1=[R1,temp]; else R2=[R2,temp]; end end Z11=mean(R1,2); %mean(A,2)包含每一行的平均值的列向量(对行求平均值) Z22=mean(R2,2); %得到新的聚类中心 t1=Z1-Z11; %测试两次是不是相等,可以有多种方法这里只简单列举一种 t2=Z2-Z22; dif1=sqrt(dot(t1,t1)); %dot两个向量的点积 dif2=sqrt(dot(t2,t2)); Z1=Z11; Z2=Z22; K=K+1; R1=[]; R2=[]; end hold on plot([Z1(1),Z2(1)],[Z1(2),Z2(2)],'g+') %最终得到的聚类中心用绿色加号 用python语言实现
时间: 2024-04-16 08:28:55 浏览: 158
你可以使用scikit-learn库来实现Python版本的K-means聚类算法。下面是使用scikit-learn库实现上述MATLAB代码的Python代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
x = np.array([[0, 1, 0, 1, 2, 1, 2, 3, 6, 7, 8, 6, 7, 8, 9, 7, 8, 9, 8, 9],
[0, 0, 1, 1, 1, 2, 2, 2, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9]])
# Plot original data
plt.figure(1)
plt.plot(x[0], x[1], 'r*')
# Perform K-means clustering
kmeans = KMeans(n_clusters=2)
kmeans.fit(x.T)
centroids = kmeans.cluster_centers_
# Plot centroids
plt.plot(centroids[:, 0], centroids[:, 1], 'g+')
plt.show()
```
这段代码首先导入所需的库,然后定义了原始数据 `x`。然后使用`KMeans`类初始化K-means聚类算法,并设置聚类中心数量为2。通过调用`fit`函数来进行聚类,并获得聚类中心坐标。最后使用`plot`函数绘制原始数据和聚类中心。
运行这段代码后,你将得到一个包含原始数据和聚类中心的散点图。原始数据用红色星号表示,聚类中心用绿色加号表示。
注意:在使用scikit-learn库时,数据的形状通常是样本数在行上,特征数在列上,因此我们使用`x.T`来转置数据。
阅读全文