使用python 实现对irir数据集实现R聚类和Q聚类
时间: 2024-05-15 13:14:15 浏览: 8
首先,需要导入一些必要的库,如numpy、pandas、scipy等。
```python
import numpy as np
import pandas as pd
from scipy.spatial.distance import cdist
from scipy.cluster.hierarchy import fcluster, linkage
```
然后,需要加载irir数据集。irir数据集是一个经典的数据集,包含了150个样本,每个样本有4个特征。
```python
# 加载数据集
dataset = pd.read_csv('iris.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
```
对于R聚类,我们可以使用层次聚类算法。首先,需要计算每个样本之间的距离。
```python
# 计算距离矩阵
dist_matrix = cdist(X, X, metric='euclidean')
```
然后,我们可以使用linkage函数来进行层次聚类。
```python
# 计算聚类结果
Z = linkage(dist_matrix, method='ward')
```
最后,我们可以使用fcluster函数来获取聚类结果。
```python
# 获取聚类结果
k = 3 # 聚类个数
labels = fcluster(Z, k, criterion='maxclust')
```
对于Q聚类,我们可以使用k-means算法。首先,需要随机初始化k个聚类中心。
```python
# 初始化聚类中心
n = X.shape[0] # 样本个数
k = 3 # 聚类个数
np.random.seed(0) # 设置随机种子
centroids = X[np.random.choice(n, k, replace=False)]
```
然后,我们可以使用循环来迭代更新聚类中心和样本的分类。
```python
# 迭代更新聚类中心和样本的分类
max_iter = 100 # 最大迭代次数
for i in range(max_iter):
# 计算样本到聚类中心的距离
dist = cdist(X, centroids, metric='euclidean')
# 获取样本所属的聚类
labels = np.argmin(dist, axis=1)
# 更新聚类中心
for j in range(k):
centroids[j] = np.mean(X[labels == j], axis=0)
```
最后,我们可以得到样本的聚类结果。
```python
# 获取聚类结果
labels = np.argmin(dist, axis=1)
```
完整的代码如下:
```python
import numpy as np
import pandas as pd
from scipy.spatial.distance import cdist
from scipy.cluster.hierarchy import fcluster, linkage
# 加载数据集
dataset = pd.read_csv('iris.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
# R聚类
# 计算距离矩阵
dist_matrix = cdist(X, X, metric='euclidean')
# 计算聚类结果
Z = linkage(dist_matrix, method='ward')
# 获取聚类结果
k = 3 # 聚类个数
labels = fcluster(Z, k, criterion='maxclust')
print(labels)
# Q聚类
# 初始化聚类中心
n = X.shape[0] # 样本个数
k = 3 # 聚类个数
np.random.seed(0) # 设置随机种子
centroids = X[np.random.choice(n, k, replace=False)]
# 迭代更新聚类中心和样本的分类
max_iter = 100 # 最大迭代次数
for i in range(max_iter):
# 计算样本到聚类中心的距离
dist = cdist(X, centroids, metric='euclidean')
# 获取样本所属的聚类
labels = np.argmin(dist, axis=1)
# 更新聚类中心
for j in range(k):
centroids[j] = np.mean(X[labels == j], axis=0)
# 获取聚类结果
labels = np.argmin(dist, axis=1)
print(labels)
```