You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python对带标签的纵向基因数据进行聚类分析?

Python实现基因谱聚类与样本关联分析

步骤1:数据预处理——将纵向数据转换为谱特征矩阵

首先需要把每个(gene_id, sample)组合的value按position排序后提取成特征向量,保证每个谱的特征顺序一致:

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 加载并初始化数据
data = {
    'gene_id': ['gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1',
                'gene_1', 'gene_1', 'gene_1', 'gene_1', 'gene_1',
                'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2',
                'gene_2', 'gene_2', 'gene_2', 'gene_2', 'gene_2',
                'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3',
                'gene_3', 'gene_3', 'gene_3', 'gene_3', 'gene_3'],
    'position': [1, 2, 3, 4, 5,
                 1, 2, 3, 4, 5,
                 1, 2, 3, 4, 5,
                 1, 2, 3, 4, 5,
                 1, 2, 3, 4, 5,
                 1, 2, 3, 4, 5],
    'value': [5.1, 5.5, 5.7, 6.0, 6.3,
              6.3, 6.5, 6.7, 6.8, 5.1,
              2.3, 2.5, 2.7, 3.0, 3.1,
              3.1, 3.2, 3.3, 3.4, 2.3,
              3.7, 3.8, 3.9, 4.0, 4.0,
              4.0, 4.1, 4.2, 4.3, 3.7],
    'sample': ['sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_B',
               'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_A',
               'sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_B',
               'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_A',
               'sample_A', 'sample_A', 'sample_A', 'sample_A', 'sample_B',
               'sample_B', 'sample_B', 'sample_B', 'sample_B', 'sample_A']
}

df = pd.DataFrame(data)

# 按position排序,确保特征顺序一致
df_sorted = df.sort_values(['gene_id', 'sample', 'position'])
# 分组提取每个(gene_id, sample)的value序列
feature_df = df_sorted.groupby(['gene_id', 'sample'])['value'].apply(list).reset_index()
# 将序列拆分为对应position的特征列
feature_matrix = pd.DataFrame(feature_df['value'].tolist(), columns=[f'pos_{i}' for i in range(1,6)])
# 合并元信息
feature_matrix = pd.concat([feature_df[['gene_id', 'sample']], feature_matrix], axis=1)

# 提取用于聚类的数值特征矩阵
X = feature_matrix.iloc[:, 2:]

步骤2:KMeans聚类分析

使用KMeans对谱特征进行聚类,同时关联样本信息:

# 初始化KMeans模型,这里设k=2(可根据肘部法则调整)
kmeans = KMeans(n_clusters=2, random_state=42)
# 拟合模型并添加聚类标签
feature_matrix['cluster_label'] = kmeans.fit_predict(X)

# 输出聚类与样本的分布统计
cluster_sample_stats = feature_matrix.groupby(['cluster_label', 'sample']).size().unstack(fill_value=0)
print("聚类-样本分布统计:")
print(cluster_sample_stats)

步骤3:可视化聚类空间(PCA降维)

通过PCA将高维特征降至2维,直观展示聚类与样本的分布关系:

# PCA降维到2维
pca = PCA(n_components=2, random_state=42)
X_pca = pca.fit_transform(X)
feature_matrix['pca_x'] = X_pca[:, 0]
feature_matrix['pca_y'] = X_pca[:, 1]

# 绘制聚类散点图
plt.figure(figsize=(8,6))
for cluster in feature_matrix['cluster_label'].unique():
    cluster_data = feature_matrix[feature_matrix['cluster_label'] == cluster]
    for sample in cluster_data['sample'].unique():
        sample_data = cluster_data[cluster_data['sample'] == sample]
        plt.scatter(sample_data['pca_x'], sample_data['pca_y'], 
                    label=f"Cluster {cluster} - {sample}",
                    alpha=0.7, s=100)
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.title("Gene Spectra Clustering (PCA Reduced) with Sample Labels")
plt.legend()
plt.grid(True)
plt.show()

步骤4:验证聚类的谱曲线特征

绘制每个聚类的平均谱曲线,验证聚类是否符合形状与幅度的预期:

plt.figure(figsize=(8,6))
positions = [1,2,3,4,5]
for cluster in feature_matrix['cluster_label'].unique():
    cluster_features = X[feature_matrix['cluster_label'] == cluster]
    mean_values = cluster_features.mean(axis=0).values
    plt.plot(positions, mean_values, label=f"Cluster {cluster} Mean Spectrum", linewidth=2)
plt.xlabel("Position")
plt.ylabel("Value")
plt.title("Mean Spectrum of Each Cluster")
plt.legend()
plt.grid(True)
plt.show()

关键提示

  • 特征一致性:必须保证每个谱的position排序一致,否则聚类特征会混乱。
  • k值选择:若不确定最优聚类数,可绘制肘部曲线(inertia随k变化的曲线)选择拐点处的k值。
  • 幅度处理:如果需要忽略幅度只关注形状,可先对特征做标准化(StandardScaler)。

内容的提问来源于stack exchange,提问作者donkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 02:25:20