1.数据读取及处理 2.初始化聚类中心(可从样本点中选取) 3.通过计算每个点到每个聚类中心的距离进行分类 4.计算每个类别对应点的坐标均值作为新的聚类中心点 5.重复3-4计算较优的聚类中心点 6.使用5中得到的聚类中心点对数据进行聚类并可视化结果
时间: 2024-02-11 11:04:02 浏览: 25
好的,下面我来为你详细介绍如何使用K-Means算法对数据进行聚类,并可视化聚类结果。
1. 数据读取及处理
首先,你需要加载数据并进行处理。假设你的数据文件为`data.csv`,你可以使用以下代码进行读取和处理:
```python
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('data.csv')
# 删除不必要的列
data = data.drop(['Unnamed: 0'], axis=1)
# 将数据转换为数组形式
X = data.values
```
2. 初始化聚类中心
接下来,你需要初始化聚类中心。你可以从样本点中随机选取一些点作为聚类中心,也可以使用K-Means++算法进行初始化。这里我们使用随机选取点的方法进行初始化:
```python
import random
# 随机选取k个中心点
def init_centers(X, k):
centers = random.sample(list(X), k)
return centers
# 初始化聚类中心
k = 3
centers = init_centers(X, k)
```
3. 通过计算每个点到每个聚类中心的距离进行分类
接下来,你需要根据每个点到每个聚类中心的距离进行分类。这里我们使用欧几里得距离进行计算:
```python
# 计算欧几里得距离
def euclidean_distance(x1, x2):
distance = 0
for i in range(len(x1)):
distance += (x1[i] - x2[i]) ** 2
return distance ** 0.5
# 计算每个点到每个聚类中心的距离
def calculate_distances(X, centers):
distances = []
for x in X:
distances.append([euclidean_distance(x, c) for c in centers])
return distances
# 对每个数据点进行分类
def assign_clusters(distances):
clusters = []
for d in distances:
# 找到距离最近的聚类中心
closest = min(range(len(d)), key=d.__getitem__)
clusters.append(closest)
return clusters
# 对数据进行分类
distances = calculate_distances(X, centers)
clusters = assign_clusters(distances)
```
4. 计算每个类别对应点的坐标均值作为新的聚类中心点
接下来,你需要计算每个类别对应点的坐标均值作为新的聚类中心点:
```python
# 计算每个类别对应点的坐标均值作为新的聚类中心点
def update_centers(X, clusters, k):
new_centers = []
for i in range(k):
members = [X[j] for j in range(len(X)) if clusters[j] == i]
if members:
centroid = [sum(col) / len(members) for col in zip(*members)]
new_centers.append(centroid)
else:
new_centers.append(random.choice(list(X)))
return new_centers
# 更新聚类中心
centers = update_centers(X, clusters, k)
```
5. 重复3-4计算较优的聚类中心点
接下来,你需要重复进行步骤3和4,直到聚类中心点不再改变或达到最大迭代次数:
```python
# 迭代聚类中心,直到聚类中心不再改变
MAX_ITERATIONS = 100
for i in range(MAX_ITERATIONS):
old_centers = centers
distances = calculate_distances(X, centers)
clusters = assign_clusters(distances)
centers = update_centers(X, clusters, k)
if old_centers == centers:
break
```
6. 使用5中得到的聚类中心点对数据进行聚类并可视化结果
最后,你可以使用得到的聚类中心点对数据进行聚类,并可视化聚类结果:
```python
# 可视化聚类结果
colors = ['r', 'g', 'b', 'y', 'c', 'm']
for i in range(k):
members = [X[j] for j in range(len(X)) if clusters[j] == i]
plt.scatter([m[0] for m in members], [m[1] for m in members], s=30, c=colors[i])
plt.scatter([c[0] for c in centers], [c[1] for c in centers], marker='*', s=200, c='black')
plt.show()
```
上述代码中,将每个类别的点用不同的颜色进行标注,将聚类中心点用星号进行标注。你可以根据实际情况调整颜色和标记大小。
完整代码如下:
```python
import pandas as pd
import matplotlib.pyplot as plt
import random
# 读取数据
data = pd.read_csv('data.csv')
# 删除不必要的列
data = data.drop(['Unnamed: 0'], axis=1)
# 将数据转换为数组形式
X = data.values
# 随机选取k个中心点
def init_centers(X, k):
centers = random.sample(list(X), k)
return centers
# 计算欧几里得距离
def euclidean_distance(x1, x2):
distance = 0
for i in range(len(x1)):
distance += (x1[i] - x2[i]) ** 2
return distance ** 0.5
# 计算每个点到每个聚类中心的距离
def calculate_distances(X, centers):
distances = []
for x in X:
distances.append([euclidean_distance(x, c) for c in centers])
return distances
# 对每个数据点进行分类
def assign_clusters(distances):
clusters = []
for d in distances:
# 找到距离最近的聚类中心
closest = min(range(len(d)), key=d.__getitem__)
clusters.append(closest)
return clusters
# 计算每个类别对应点的坐标均值作为新的聚类中心点
def update_centers(X, clusters, k):
new_centers = []
for i in range(k):
members = [X[j] for j in range(len(X)) if clusters[j] == i]
if members:
centroid = [sum(col) / len(members) for col in zip(*members)]
new_centers.append(centroid)
else:
new_centers.append(random.choice(list(X)))
return new_centers
# 初始化聚类中心
k = 3
centers = init_centers(X, k)
# 迭代聚类中心,直到聚类中心不再改变
MAX_ITERATIONS = 100
for i in range(MAX_ITERATIONS):
old_centers = centers
distances = calculate_distances(X, centers)
clusters = assign_clusters(distances)
centers = update_centers(X, clusters, k)
if old_centers == centers:
break
# 可视化聚类结果
colors = ['r', 'g', 'b', 'y', 'c', 'm']
for i in range(k):
members = [X[j] for j in range(len(X)) if clusters[j] == i]
plt.scatter([m[0] for m in members], [m[1] for m in members], s=30, c=colors[i])
plt.scatter([c[0] for c in centers], [c[1] for c in centers], marker='*', s=200, c='black')
plt.show()
```