代码实现用PSO算法对Kmeans聚类中心的优化,并且进行可视化展示,要求与原本的Kmeans算法进行对比,数据用iris数据集
时间: 2024-02-22 18:58:18 浏览: 166
好的,下面是一个实现用PSO算法优化Kmeans聚类中心的Python代码,并进行可视化展示:
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
# 加载 iris 数据集
data = load_iris().data
# 定义适应度函数
def fitness_func(positions, data):
k = len(positions) # 聚类中心的个数
kmeans = KMeans(n_clusters=k, init=positions, n_init=1)
kmeans.fit(data)
return kmeans.inertia_
# 定义 PSO 算法
def pso(k, data, n_particles=20, n_max_iterations=50, w=0.7, c1=2, c2=2):
n_dim = data.shape[1] # 数据维度
positions = np.random.rand(n_particles, k, n_dim) # 初始化粒子位置
velocities = np.zeros((n_particles, k, n_dim)) # 初始化粒子速度
pbest_positions = positions.copy() # 初始化个体最优位置
pbest_values = np.zeros(n_particles) # 初始化个体最优适应度值
gbest_position = np.zeros((k, n_dim)) # 初始化全局最优位置
gbest_value = np.inf # 初始化全局最优适应度值
for i in range(n_max_iterations):
for j in range(n_particles):
# 计算适应度值
fitness_value = fitness_func(positions[j], data)
# 更新个体最优位置
if fitness_value < pbest_values[j]:
pbest_positions[j] = positions[j].copy()
pbest_values[j] = fitness_value
# 更新全局最优位置
if fitness_value < gbest_value:
gbest_position = positions[j].copy()
gbest_value = fitness_value
# 更新粒子速度和位置
r1 = np.random.rand(n_particles, k, n_dim)
r2 = np.random.rand(n_particles, k, n_dim)
velocities = w*velocities + c1*r1*(pbest_positions-positions) + c2*r2*(gbest_position-positions)
positions = positions + velocities
return gbest_position
# 使用 Kmeans 算法进行聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(data)
kmeans_centers = kmeans.cluster_centers_
# 使用 PSO 算法进行聚类中心优化
pso_centers = pso(3, data)
# 可视化展示
plt.subplot(1, 2, 1)
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_)
plt.scatter(kmeans_centers[:, 0], kmeans_centers[:, 1], marker='x', s=300, linewidths=3, color='r')
plt.title('Kmeans Algorithm')
plt.subplot(1, 2, 2)
plt.scatter(data[:, 0], data[:, 1], c=kmeans.labels_)
plt.scatter(pso_centers[:, 0], pso_centers[:, 1], marker='x', s=300, linewidths=3, color='r')
plt.title('PSO+Kmeans Algorithm')
plt.show()
```
该代码中先使用 Kmeans 算法进行聚类,并将聚类中心可视化展示出来。然后再使用 PSO 算法对聚类中心进行优化,并将优化后的结果与原本的 Kmeans 算法进行对比,将优化后的聚类中心也进行可视化展示。
阅读全文