1、将博客中的K-means算法代码调通; 2、将调通的算法用于给定的data.csv数据文件,假设聚类中心个数为3; 3、将data.csv聚类结果用matplotlib绘制出来。
时间: 2024-03-02 13:53:13 浏览: 81
isodata的matlab代码博客-ML-K-Means:K均值算法,用于聚类
好的,让我来回答你的问题。
1. 调通K-means算法代码
K-means算法的Python代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
class KMeans:
def __init__(self, k=3, max_iter=100):
self.k = k
self.max_iter = max_iter
def fit(self, X):
# 随机初始化聚类中心
idx = np.random.choice(len(X), self.k, replace=False)
self.centroids = X[idx]
for _ in range(self.max_iter):
# 计算每个样本距离哪个聚类中心最近
labels = np.argmin(np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2)), axis=0)
# 更新聚类中心为所属类别的均值
self.centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)])
self.labels = labels
def predict(self, X):
# 预测新数据所属类别
return np.argmin(np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2)), axis=0)
```
2. 将K-means算法应用于给定的data.csv数据文件
在使用K-means算法之前,我们需要先将数据读入并进行预处理。假设data.csv文件中的数据分别为x和y两个维度,我们可以使用以下代码将数据读取并进行预处理:
```python
import pandas as pd
# 读取数据
data = pd.read_csv('data.csv')
# 去除缺失值
data.dropna(inplace=True)
# 提取x和y两个维度
X = data[['x', 'y']].values
```
接下来,我们可以使用KMeans类对数据进行聚类:
```python
# 对数据进行聚类
kmeans = KMeans(k=3, max_iter=100)
kmeans.fit(X)
```
3. 使用matplotlib绘制聚类结果
最后,我们可以使用matplotlib绘制聚类结果。下面是绘制聚类结果的代码:
```python
# 绘制聚类结果
plt.scatter(X[kmeans.labels == 0][:, 0], X[kmeans.labels == 0][:, 1], color='red')
plt.scatter(X[kmeans.labels == 1][:, 0], X[kmeans.labels == 1][:, 1], color='blue')
plt.scatter(X[kmeans.labels == 2][:, 0], X[kmeans.labels == 2][:, 1], color='green')
plt.scatter(kmeans.centroids[:, 0], kmeans.centroids[:, 1], color='black', marker='x', s=100)
plt.show()
```
完整的代码如下:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
class KMeans:
def __init__(self, k=3, max_iter=100):
self.k = k
self.max_iter = max_iter
def fit(self, X):
# 随机初始化聚类中心
idx = np.random.choice(len(X), self.k, replace=False)
self.centroids = X[idx]
for _ in range(self.max_iter):
# 计算每个样本距离哪个聚类中心最近
labels = np.argmin(np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2)), axis=0)
# 更新聚类中心为所属类别的均值
self.centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)])
self.labels = labels
def predict(self, X):
# 预测新数据所属类别
return np.argmin(np.sqrt(((X - self.centroids[:, np.newaxis])**2).sum(axis=2)), axis=0)
# 读取数据
data = pd.read_csv('data.csv')
# 去除缺失值
data.dropna(inplace=True)
# 提取x和y两个维度
X = data[['x', 'y']].values
# 对数据进行聚类
kmeans = KMeans(k=3, max_iter=100)
kmeans.fit(X)
# 绘制聚类结果
plt.scatter(X[kmeans.labels == 0][:, 0], X[kmeans.labels == 0][:, 1], color='red')
plt.scatter(X[kmeans.labels == 1][:, 0], X[kmeans.labels == 1][:, 1], color='blue')
plt.scatter(X[kmeans.labels == 2][:, 0], X[kmeans.labels == 2][:, 1], color='green')
plt.scatter(kmeans.centroids[:, 0], kmeans.centroids[:, 1], color='black', marker='x', s=100)
plt.show()
```
注意,这里的聚类中心个数为3,你可以根据需要进行修改。
阅读全文