使用Python语言实现Kmeans算法,且测试process.cleveland.data中数据标准化对Kmeans算法的影响
时间: 2024-05-12 20:14:22 浏览: 98
python实现kMeans算法
好的,我可以帮你实现Kmeans算法并且测试数据标准化对Kmeans算法的影响。首先,我们需要导入必要的库和数据集:
```python
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 导入数据集
data = pd.read_csv('process.cleveland.data', header=None)
```
接下来,我们需要对数据进行标准化处理,使得所有特征都在相同的尺度上。我们可以使用`StandardScaler`类来完成标准化。
```python
# 标准化数据
scaler = StandardScaler()
data_std = scaler.fit_transform(data)
```
接下来,我们可以开始实现Kmeans算法。Kmeans算法的步骤如下:
1. 随机选择$k$个数据点作为初始聚类中心。
2. 对于每个数据点,计算其与每个聚类中心的距离,并将其划分到距离最近的聚类中心所在的簇。
3. 对于每个簇,计算其所有数据点的平均值,并将其作为新的聚类中心。
4. 重复步骤2和步骤3,直到聚类中心不再变化或达到最大迭代次数。
```python
class KMeans:
def __init__(self, k=5, max_iter=100):
self.k = k
self.max_iter = max_iter
def fit(self, X):
# 随机初始化聚类中心
centroids = X[np.random.choice(len(X), self.k, replace=False)]
for i in range(self.max_iter):
# 计算每个数据点到聚类中心的距离
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
# 将每个数据点划分到距离最近的聚类中心所在的簇
labels = np.argmin(distances, axis=0)
# 更新聚类中心
centroids_new = np.zeros_like(centroids)
for j in range(self.k):
centroids_new[j] = X[labels == j].mean(axis=0)
# 如果聚类中心不再变化,则停止迭代
if np.allclose(centroids, centroids_new):
break
centroids = centroids_new
self.labels_ = labels
self.cluster_centers_ = centroids
```
现在,我们可以使用KMeans类对标准化数据进行聚类:
```python
# 聚类
kmeans = KMeans(k=5, max_iter=100)
kmeans.fit(data_std)
# 打印聚类中心
print(kmeans.cluster_centers_)
```
最后,我们可以比较使用标准化数据和未标准化数据聚类的结果,看看标准化对聚类结果的影响。
```python
# 使用未标准化数据聚类
kmeans = KMeans(k=5, max_iter=100)
kmeans.fit(data)
# 打印聚类中心
print(kmeans.cluster_centers_)
```
根据聚类中心的值,我们可以看出使用标准化数据聚类的结果更加准确,因为标准化后的数据所有特征都在相同的尺度上,而未标准化的数据则会受到不同特征尺度的影响。
阅读全文