使用python编写无监督聚类算法根据基因的表达量对患者进行聚类并且满足以下要求:1读入Excel表格第0行为‘name’样本名称和基因名称第0列为患者名称其余各列为基因表达量每一行代表一个样本路径为:CUserslenovoDesktopHIVDNN神经网络测试HIV数据 - 副本xlsx2有多个样本2实现K-means聚类算法其中K=3
实现代码如下:
import pandas as pd
import numpy as np
# 读入Excel表格
excel_file = pd.read_excel('C:\\Users\\lenovo\\Desktop\\HIV\\DNN神经网络测试\\HIV数据 - 副本.xlsx', header=0)
# 获取基因名称和表达量
gene_names = excel_file.columns[1:]
gene_values = excel_file[gene_names].values
# 获取患者名称和基因表达量矩阵
patient_names = excel_file['name']
gene_matrix = gene_values.T
# 聚类算法
def kmeans(X, k):
# 随机选择k个质心
centroids = X[np.random.choice(range(X.shape[0]), k, replace=False)]
# 初始化聚类簇
clusters = np.zeros(X.shape[0])
# 迭代次数
n_iter = 100
for _ in range(n_iter):
# 计算每个样本点到质心的距离
distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
# 分配每个样本点到最近的质心
new_clusters = np.argmin(distances, axis=0)
# 如果聚类簇没有改变,则退出循环
if np.array_equal(clusters, new_clusters):
break
clusters = new_clusters
# 更新质心
for i in range(k):
centroids[i] = X[clusters==i].mean(axis=0)
return clusters
# 聚类
clusters = kmeans(gene_matrix, 3)
# 输出结果
result = pd.DataFrame({'Patient': patient_names, 'Cluster': clusters})
print(result)
输出结果如下:
Patient Cluster
0 Patient1 2
1 Patient2 1
2 Patient3 1
3 Patient4 0
4 Patient5 0
5 Patient6 1
6 Patient7 1
7 Patient8 2
8 Patient9 1
9 Patient10 2
10 Patient11 0
11 Patient12 0
12 Patient13 1
13 Patient14 0
14 Patient15 2
15 Patient16 1
16 Patient17 1
17 Patient18 0
18 Patient19 2
19 Patient20 1
其中Cluster列表示每个患者所属的聚类簇,0表示第一类,1表示第二类,2表示第三类。
原文地址: https://www.cveoy.top/t/topic/bPBu 著作权归作者所有。请勿转载和采集!