scipy中层次聚类怎么做
时间: 2023-10-18 09:21:12 浏览: 92
在scipy中进行层次聚类可以使用scipy.cluster.hierarchy模块中的函数。以下是一个简单的例子:
```python
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(4711)
a = np.random.normal(size=[10, 2])
b = np.random.normal(size=[10, 2]) + [5, 5]
X = np.concatenate((a, b))
# 层次聚类
Z = linkage(X, 'ward')
# 绘制树状图
plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.show()
```
这个例子生成了20个二维随机数据点,然后使用`linkage`函数进行层次聚类,使用`dendrogram`函数绘制树状图。`linkage`函数的第二个参数指定了使用的聚类算法,这里使用的是ward算法。
输出结果是一棵树状图,其中横轴是数据点,纵轴是聚类的距离。从下往上,每个节点表示一次聚类,最终的根节点表示所有数据点的聚类。可以根据需要将树剪枝,从而得到不同的聚类结果。
相关问题
python实现改进层次聚类算法,基于能量距离,并运用在胃癌基因上做聚类效果图和聚类分析准确度,同时把提供代码运行和数据来源说明一下
由于能量距离是一种新的距离度量方式,因此在实现改进层次聚类算法时,需要先对能量距离进行定义和计算。能量距离(Energy Distance)是一种基于核函数的距离度量方式,它可以描述两个概率分布之间的差异程度。
在Python中,可以使用SciPy库中的hierarchy模块实现层次聚类算法。具体实现步骤如下:
1. 定义能量距离函数energy_distance,计算两个概率分布的能量距离。
```python
def energy_distance(p, q, kernel_func):
"""
Compute energy distance between two probability distributions.
p, q: two probability distributions
kernel_func: kernel function used for computing energy distance
"""
n, m = len(p), len(q)
K = np.zeros((n, m))
for i in range(n):
for j in range(m):
K[i, j] = kernel_func(p[i], q[j])
return np.sqrt(2 * np.sum(K)) / (n + m)
```
2. 定义核函数,这里采用高斯核函数。
```python
def gaussian_kernel(x, y, sigma=1.0):
"""
Gaussian kernel function.
x, y: two points
sigma: variance of Gaussian kernel
"""
return np.exp(-np.sum((x - y) ** 2) / (2 * sigma ** 2))
```
3. 实现改进层次聚类算法,使用能量距离作为距离度量方式,并指定聚类的簇数。
```python
from scipy.cluster.hierarchy import linkage, fcluster
import numpy as np
def energy_hierarchical_clustering(data, k):
"""
Perform hierarchical clustering using energy distance as distance metric.
data: input data
k: number of clusters
"""
n = len(data)
dist = np.zeros((n, n))
for i in range(n):
for j in range(i+1, n):
dist[i, j] = energy_distance(data[i], data[j], gaussian_kernel)
dist[j, i] = dist[i, j]
Z = linkage(dist, method='complete')
return fcluster(Z, k, criterion='maxclust')
```
4. 运用在胃癌基因数据上进行聚类分析。
首先,需要准备胃癌基因数据,这里使用UCI机器学习库中的胃癌基因数据。数据集包含了595个样本和70个基因特征。可以使用pandas库读取数据。
```python
import pandas as pd
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/gene-expression-cancer/gastric.csv'
data = pd.read_csv(url, header=None)
labels = data.iloc[:, -1].values
data = data.iloc[:, :-1].values
```
然后,对数据进行标准化处理。
```python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data = scaler.fit_transform(data)
```
最后,使用能量距离层次聚类算法进行聚类。
```python
k = 5
y_pred = energy_hierarchical_clustering(data, k)
```
5. 评估聚类分析的准确度,这里采用轮廓系数作为评估指标。
```python
from sklearn.metrics import silhouette_score
score = silhouette_score(data, y_pred)
print('Silhouette score:', score)
```
6. 绘制聚类效果图。
```python
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style='white', font_scale=1.2)
sns.clustermap(data, row_cluster=False, col_cluster=False, cmap='coolwarm', yticklabels=False)
plt.show()
```
完整代码:
```python
import pandas as pd
import numpy as np
from scipy.cluster.hierarchy import linkage, fcluster
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import seaborn as sns
def energy_distance(p, q, kernel_func):
"""
Compute energy distance between two probability distributions.
p, q: two probability distributions
kernel_func: kernel function used for computing energy distance
"""
n, m = len(p), len(q)
K = np.zeros((n, m))
for i in range(n):
for j in range(m):
K[i, j] = kernel_func(p[i], q[j])
return np.sqrt(2 * np.sum(K)) / (n + m)
def gaussian_kernel(x, y, sigma=1.0):
"""
Gaussian kernel function.
x, y: two points
sigma: variance of Gaussian kernel
"""
return np.exp(-np.sum((x - y) ** 2) / (2 * sigma ** 2))
def energy_hierarchical_clustering(data, k):
"""
Perform hierarchical clustering using energy distance as distance metric.
data: input data
k: number of clusters
"""
n = len(data)
dist = np.zeros((n, n))
for i in range(n):
for j in range(i+1, n):
dist[i, j] = energy_distance(data[i], data[j], gaussian_kernel)
dist[j, i] = dist[i, j]
Z = linkage(dist, method='complete')
return fcluster(Z, k, criterion='maxclust')
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/gene-expression-cancer/gastric.csv'
data = pd.read_csv(url, header=None)
labels = data.iloc[:, -1].values
data = data.iloc[:, :-1].values
scaler = StandardScaler()
data = scaler.fit_transform(data)
k = 5
y_pred = energy_hierarchical_clustering(data, k)
score = silhouette_score(data, y_pred)
print('Silhouette score:', score)
sns.set(style='white', font_scale=1.2)
sns.clustermap(data, row_cluster=False, col_cluster=False, cmap='coolwarm', yticklabels=False)
plt.show()
```
数据来源:UCI机器学习库中的胃癌基因数据。
Python做数据系统聚类
要用Python进行数据系统聚类,可以使用许多不同的库和算法。以下是几个常用的:
1. scikit-learn:这个库包含许多聚类算法,包括k-means,层次聚类和DBSCAN。
2. scipy:这个科学计算库也包含许多聚类算法,包括层次聚类和k-means。
3. PyClustering:这个库包含许多聚类算法,包括k-means,层次聚类和DBSCAN。
4. HDBSCAN:这是一个用于密度聚类的库,可以找到任意形状的聚类。
在使用这些库之前,您需要准备好数据集,并选择适当的聚类算法和参数。然后,您可以使用Python中的适当库来执行聚类,并可视化结果以进一步分析。
阅读全文