提供的数据集是字符串形式,且不符合聚类的要求,需要进行转置,因此对数据进行预处理。
1、读入103个基因组的名称
with open(r'C:\\Users\\langgoubao\\Desktop\\genName.csv', 'r') as f0:
reader0 = csv.reader(f0)
for row in reader0:
for i in row:
geneName.append(i)
2、读取家族次数到嵌套列表中
这里基因家族次数是隐藏在字符串中,且以‘|’进行分隔,需要进行处理,形式如下:
“3|1|2|2|6|8|5|5|0|2|0|2|8|3|1|4|2|3|2|0|19|0|1|2|14|10|1|0|4|0|0|2|0|0|0|1|1|6|0|1|1|2|0|2|0|2|0|0|1|0|0|1|0|2|6|4|1”
这里直接调用文本的split()方法,将‘|’设置为分隔符就可以,再将分隔好的每一行添加到列表中即可。
with open(r'C:\\Users\\langgoubao\\Desktop\\data1.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:\n
for i in row:\n
x = i.split(\"|\")
#转化为int数据类型
y=list(map(int,x))
l.append(y)\n",
f.close()\n",
3、对处理好的基因数据列表进行转置
这里为了方便转置,先将列表转化为矩阵,然后直接调用矩阵转置的方法进行转置即可。
#存储入矩阵中
x=np.array(l)
#转置
geneData = np.transpose(x)
4、处理后的数据信息如下:
基因信息矩阵大小:103*40772,每一行表示一个基因组,每一列表示该基因家族在基因组中出现的次数。
1、首先引入相关的库
import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import AgglomerativeClustering
from sklearn import datasets
from sklearn import decomposition as skldec #用于主成分分析降维的包
2、聚类
调用自底而上的层次聚类方法 AgglomerativeClustering(),构造层次 聚类器,linkage 是“ward”表示是单连接聚类,即采用两个类群中彼此间距 离最近的两个对象的距离来当作聚类类群的距离,并规定聚类的簇数规定为 3;将处理后的基因组矩阵传入构造器就可以完成聚类,最后获取每个基因组的 聚类标签,就可以得知每个基因组属于哪个簇。
clustering = AgglomerativeClustering(linkage='ward', n_clusters=3)# 构造聚类器
clustering.fit(geneData)# 聚类
label_pred = clustering.labels_ # 获取聚类标签
算法具体描述如下:
3、聚类可视化
为了可以在二维平面上可视化聚类点,首先用 PCA 进行了降维,其中 result 的两个维度就是两个主成分的得分,将维数降为了 2,绘制 103 个基因 组两成分的散点图,不同的散点颜色表示不同的簇,以此实现了在二维平面上 将聚类可视化。
#根据两个最大的主成分进行绘图
df=pd.DataFrame(geneData)
#根据两个最大的主成分进行绘图
pca = skldec.PCA(n_components = 0.95) #选择方差95%的占比
pca.fit(df) #主城分析时每一行是一个输入数据
result = pca.transform(df) #计算结果
#绘图
plt.figure()
d0 = result[clustering.labels_ == 0]
plt.plot(d0[:, 0], d0[:, 1], 'r.',label='Cluster1')
d1 = result[clustering.labels_ == 1]
plt.plot(d1[:, 0], d1[:, 1], 'go',label='Cluster2')
d2 = result[clustering.labels_ == 2]
plt.plot(d2[:, 0], d2[:, 1], 'b*',label='Cluster3')
x_label = 'PC1' #x轴标签字符串
y_label = 'PC2' #y轴标签字符串
plt.legend()
plt.xlabel(x_label)#绘制x轴标签
plt.ylabel(y_label) #绘制y轴标签
plt.title(\"AGNES Clustering\")
plt.show()
聚类可视化图片如下,横纵坐标为主成分分析法得到的两个主成分因子。
经过层次聚类,103个基因组分为了3簇,数量分别是48、14、41,属于同一簇的基因组更为相似,具体输出信息如下:
第 1 簇包含的基因组(48 个基因组): [‘pund’, ‘piss’, ‘sm99’, ‘ptet’, ‘ppry’, ‘pmag’, ‘plip’, ‘pphe’, ‘pulv’, ‘ptun’, ‘pspo’, ‘T6c’, ‘ATCC_14393’, ‘KCTC_12958’, ‘SCSIO_04301’, ‘ATCC_29581’, ‘KCTC_12086’, ‘CP76’, ‘520P1_No_412’, ‘520P1_No_423’, ‘23_GOM_1509m’, ‘6BO_GOM_1096m’, ‘A2’, ‘H105’, ‘ND6B’, ‘OCN003’, ‘P1_16_1b’, ‘P1_26’, ‘P1_8’, ‘P1_9’, ‘PAMC_22718’, ‘PLSV’, ‘SCSIO_11900’, ‘SM9913’,
‘SW0106_04’, ‘UCD_33C’, ‘XI10’, ‘UCD_SED8’, ‘D2’, ‘asag’, ‘amac’, ‘cpsy’, ‘gpsy’, ‘iloi’, ‘smr1’, ‘pao1’, ‘vcho’, ‘ecoli’]
第 2 簇包含的基因组(14 个基因组): [‘paur’, ‘pcit’, ‘plut’, ‘prub’, ‘ppep’, ‘pfla’, ‘ppis’, ‘ATCC_700519’, ‘JG1’, ‘2ta16’, ‘S4054’, ‘ATCC_15057’, ‘NJ631’, ‘R3’]
第 3 簇包含的基因组(41 个基因组): [‘paga’, ‘pesp’, ‘pcar’, ‘pman’, ‘pali’, ‘parc’, ‘ppar’, ‘ptra’, ‘t125’, ‘pnig’, ‘S816’, ‘ATCC_700518’, ‘NCIMB_2033’, ‘AC163’, ‘ANT505’, ‘TAB23’, ‘TAE56’, ‘TAE79’, ‘TAE80’, ‘TB13’, ‘TB25’, ‘TB64’, ‘TAC125’, ‘10_33’, ‘13_15’, ‘Bsw20308’, ‘ECSMB14103’, ‘H100’, ‘H103’, ‘H71’, ‘NW_4327’, ‘P1_11’, ‘P1_13_1a’, ‘P1_25’, ‘P1_30’, ‘P1_7a’, ‘S2292’, ‘S3431’, ‘S8_38’, ‘S8_8’, ‘TB51’]
注:由于数据集是老师提供给练习使用的,数据集就不公开了。