设计K均值聚类法分类器,并编写程序
时间: 2024-03-16 19:47:42 浏览: 17
好的,以下是一个基于k均值聚类算法的分类器的Python实现示例代码:
```python
import numpy as np
class KMeansClassifier:
def __init__(self, k):
self.k = k
def fit(self, X):
# 随机初始化k个聚类中心
self.centroids = X[np.random.choice(len(X), self.k, replace=False)]
while True:
# 计算各个样本点到聚类中心的距离
distances = np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2))
# 将每个样本点分配到距离最近的聚类中心
labels = np.argmin(distances, axis=0)
# 计算每个聚类中心的平均值,得到新的聚类中心
new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)])
# 如果新的聚类中心与旧的聚类中心相同,则停止迭代
if np.all(self.centroids == new_centroids):
break
self.centroids = new_centroids
self.labels = np.array([np.argmin(np.sqrt(((x - self.centroids)**2).sum(axis=1))) for x in X])
def predict(self, X):
return np.array([np.argmin(np.sqrt(((x - self.centroids)**2).sum(axis=1))) for x in X])
```
在该代码中,我们定义了一个名为`KMeansClassifier`的类,其中`k`表示要聚成的类别数,`fit`方法用于训练模型,`X`是一个$m \times n$的矩阵,表示$m$个$n$维向量的数据集,`predict`方法用于对新数据进行预测,`X`是一个$m' \times n$的矩阵,表示$m'$个$n$维向量的测试集。
在`fit`方法中,我们首先随机初始化$k$个聚类中心,然后不断迭代,直到聚类中心不再发生变化。在每次迭代中,我们首先计算各个样本点到聚类中心的距离,然后将每个样本点分配到距离最近的聚类中心,计算每个聚类中心的平均值,得到新的聚类中心。如果新的聚类中心与旧的聚类中心相同,则停止迭代。
在`predict`方法中,我们首先根据训练好的聚类中心,将测试集中的每个向量分配到距离最近的聚类中心,然后返回每个向量所属的类别。
使用该分类器的示例代码:
```python
# 生成随机数据
X = np.random.rand(100, 2)
# 创建一个KMeansClassifier实例,聚成3类
clf = KMeansClassifier(3)
# 训练模型
clf.fit(X)
# 预测新数据
y_pred = clf.predict(X)
# 打印预测结果
print(y_pred)
```