能不能用粒子群算法把这个数组分成三类呢,<10的一类,>20的一类,>10<20的一类,并且绘制出散点图,颜色是蓝色,红色和紫色
时间: 2024-03-07 14:47:36 浏览: 18
可以使用粒子群算法将这个数组分成三类,并用散点图表示。以下是一个 Python 示例代码:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, SpectralClustering, AgglomerativeClustering, DBSCAN, Birch, OPTICS
from sklearn.metrics import silhouette_score
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler
import seaborn as sns
import pandas as pd
# 构造数据
data = np.array([[1, 2], [3, 4], [5, 6], [21, 22], [23, 24], [25, 26], [11, 12], [13, 14], [15, 16], [4, 26], [7, 18], [13, 22], [21, 4], [14, 23], [11, 25], [11, 18], [12, 15], [16, 19]])
# 数据归一化
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# PCA 降维
pca = PCA(n_components=2)
data_pca = pca.fit_transform(data_scaled)
# 粒子群算法聚类
n_clusters = 3
swarm_size = 100
max_iter = 100
w = 0.5
c1 = 1
c2 = 1
v_max = 1
n_features = data_pca.shape[1]
class Particle:
def __init__(self):
self.position = np.random.rand(n_features) * 2 - 1
self.velocity = np.zeros(n_features)
self.pbest_position = self.position.copy()
self.pbest_fitness = float('inf')
self.fitness = float('inf')
def update_velocity(self, gbest_position):
r1 = np.random.rand(n_features)
r2 = np.random.rand(n_features)
cognitive_velocity = c1 * r1 * (self.pbest_position - self.position)
social_velocity = c2 * r2 * (gbest_position - self.position)
self.velocity = w * self.velocity + cognitive_velocity + social_velocity
# 限制速度范围
self.velocity = np.clip(self.velocity, -v_max, v_max)
def update_position(self):
self.position = self.position + self.velocity
# 限制位置范围
self.position = np.clip(self.position, -1, 1)
def calculate_fitness(self, centroids):
distances = np.sqrt(np.sum((self.position - centroids) ** 2, axis=1))
self.fitness = np.min(distances)
if self.fitness < self.pbest_fitness:
self.pbest_fitness = self.fitness
self.pbest_position = self.position.copy()
class PSO:
def __init__(self, n_clusters, swarm_size, max_iter):
self.n_clusters = n_clusters
self.swarm_size = swarm_size
self.max_iter = max_iter
self.swarm = [Particle() for i in range(swarm_size)]
self.gbest_position = None
self.gbest_fitness = float('inf')
def fit(self, data):
for i in range(self.max_iter):
for particle in self.swarm:
centroids = self.get_centroids(particle.position, data)
particle.calculate_fitness(centroids)
if particle.fitness < self.gbest_fitness:
self.gbest_fitness = particle.fitness
self.gbest_position = particle.position.copy()
for particle in self.swarm:
particle.update_velocity(self.gbest_position)
particle.update_position()
def get_centroids(self, position, data):
kmeans = KMeans(n_clusters=self.n_clusters, init=position.reshape(self.n_clusters, -1), n_init=1)
kmeans.fit(data)
return kmeans.cluster_centers_
def predict(self, data):
centroids = self.get_centroids(self.gbest_position, data)
distances = np.sqrt(np.sum((data - centroids[:, np.newaxis]) ** 2, axis=2))
labels = np.argmin(distances, axis=0)
return labels
pso = PSO(n_clusters, swarm_size, max_iter)
pso.fit(data_pca)
labels = pso.predict(data_pca)
# 绘制散点图
df = pd.DataFrame(data_pca, columns=['x', 'y'])
df['label'] = labels
colors = ['blue', 'red', 'purple']
sns.scatterplot(x='x', y='y', hue='label', data=df, palette=sns.color_palette(colors), legend='full')
plt.show()
```
这个代码使用粒子群算法聚类将数据分成三类,并使用散点图表示。在这个代码中,我们使用了 `sklearn` 库中的 `KMeans` 算法来获得每个粒子的聚类中心,并计算每个粒子的适应度。使用 `KMeans` 算法得到的聚类中心是一组初始的参数值,每个粒子通过 PSO 算法不断优化这些参数值,以获得最优的聚类结果。
在 PSO 算法中,我们使用了 `Particle` 类来表示一个粒子,其中 `position` 表示当前的参数值,`velocity` 表示当前的速度,`pbest_position` 和 `pbest_fitness` 表示粒子历史上最优的参数值和适应度值,`fitness` 表示当前的适应度值。在 `PSO` 类中,我们使用 `Swarm` 列表来存储所有的粒子,并定义了 `fit()` 和 `predict()` 方法来训练和预测模型。在 `fit()` 方法中,我们使用 PSO 算法不断更新每个粒子的速度和位置,并计算每个粒子的适应度值。在 `predict()` 方法中,我们使用 PSO 算法得到的最优参数值来计算聚类中心,并使用聚类中心对数据进行聚类。
最后,我们使用 `seaborn` 库绘制散点图,用不同的颜色表示不同的聚类结果。在这个代码中,我们使用 PCA 将数据降维到二维空间中,并使用 TSNE 和 StandardScaler 进行数据预处理。你可以根据需要修改这些参数。