聚类分析:不用sklearn,将目录下所有的POSCAR结构文件进行聚类,以便发现相似的结构和C原子的分布规律。。具体代码
时间: 2024-03-17 20:43:37 浏览: 59
好的,下面是一个不使用sklearn的简单聚类代码,它可以读取目录下的所有POSCAR文件,计算每个文件中C原子的分布规律,并使用KMeans算法进行聚类。
```python
import os
import numpy as np
from pymatgen import Structure
# 读取目录下所有POSCAR文件
structures = []
for file in os.listdir('.'):
if file.endswith('.POSCAR'):
structures.append(Structure.from_file(file))
# 计算每个文件中C原子的分布规律
c_coords = []
for structure in structures:
c_indices = [i for i, site in enumerate(structure) if site.specie.symbol == 'C']
c_coords.append([len([j for j, site2 in enumerate(structure) if site2.specie.symbol == 'C' and np.linalg.norm(site.coords - site2.coords) < 2]) for site in structure if site.specie.symbol == 'C'])
# 将C原子分布规律转换为numpy数组
c_coords = np.array(c_coords)
# 定义KMeans算法
def kmeans(X, k):
centroids = X[np.random.choice(range(len(X)), k, replace=False)]
while True:
clusters = [[] for i in range(k)]
for x in X:
distances = np.linalg.norm(x - centroids, axis=1)
cluster = np.argmin(distances)
clusters[cluster].append(x)
new_centroids = [np.mean(cluster, axis=0) for cluster in clusters]
if np.array_equal(new_centroids, centroids):
break
centroids = new_centroids
return clusters
# 使用KMeans算法进行聚类
clusters = kmeans(c_coords, 3)
# 输出每个簇中的文件名
for i, cluster in enumerate(clusters):
print('Cluster {}:'.format(i))
for j in range(len(structures)):
if c_coords[j] in cluster:
print(os.listdir('.')[j])
print()
```
这里使用了pymatgen库来解析POSCAR文件和计算C原子的分布规律,手写实现了KMeans算法进行聚类。你可以根据自己的需要更改聚类的簇数,以及使用其他算法进行聚类。
阅读全文