3D Clustering algorithms
Version 1

No description specified

SEEK ID: https://fairdomhub.org/documents/790?version=1

Filename: clustering.py  Download

Format: Plain text document

Size: 5.86 KB

# -*- coding: utf-8 -*-
"""
Created on Thu Jun 27 12:06:13 2019

@author: mhill
"""

"""
clustering.py

clusters preprocessed data using DBSCAN
"""

""" importing stuff """

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.cluster import DBSCAN

""" declarations and loading data """
# locations, where the preprocessed data is stored and where the clustered data should be stored
file_location = 'H:/Internship/ML-Models/Results/Preprocessing/'
save_location = 'H:/Internship/ML-Models/Results/Clustering/'

# create Dataframes, where the clustered data should be stored
cluster_results_cells = pd.DataFrame()
cluster_results_nuclei = pd.DataFrame()

# define parameters for DBSCAN
epsilon = [0.3,0.5,2,4,5,10]
neighbors = [5,10,20]

# choose the mapping, on which you want to cluster
cell_mapping = ['10D_PCA_2D_TSNE_1_perplexity_5','10D_PCA_2D_TSNE_2_perplexity_5']
nuclei_mapping = ['2D_UMAP_1_neighbors_10_dist_0.0','2D_UMAP_2_neighbors_10_dist_0.0']

# show the clustering or not?
show_flag = 1

# read in the preprocessed data
cell_data = pd.read_csv(file_location+'mapped_cell_data.csv').drop(columns=['Unnamed: 0'])
nuclei_data = pd.read_csv(file_location+'mapped_nuclei_data.csv').drop(columns=['Unnamed: 0'])

""" clustering """

# loop over the parameters for DBSCAN
for e in epsilon:
    for n in neighbors:

        # create a DBSCAN clustering of the cells with the set of parameters
        db = DBSCAN(eps=e, min_samples=n).fit(cell_data[cell_mapping].values)
        core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
        core_samples_mask[db.core_sample_indices_] = True
        labels = db.labels_
        cluster_results_cells['eps_'+str(e)+'_samples_'+str(n)] = labels
        n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
        n_noise_ = list(labels).count(-1)

        # print statistics
        print('Cells: Estimated number of clusters for eps = '+str(e)+' and min_samples = '+str(n)+': %d' % n_clusters_)
        print('Cells: Estimated number of noise points for eps = '+str(e)+' and min_samples = '+str(n)+': %d' % n_noise_)

        # create a figure
        plt.figure()
        unique_labels = set(labels)
        colors = [plt.cm.Spectral(each)
                  for each in np.linspace(0, 1, len(unique_labels))]
        for k, col in zip(unique_labels, colors):
            if k == -1:
                # Black used for noise.
                col = [0, 0, 0, 1]

            class_member_mask = (labels == k)

            xy = cell_data[cell_mapping].values[class_member_mask & core_samples_mask]
            plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), \
                     markeredgecolor='k', markersize=14)

            xy = cell_data[cell_mapping].values[class_member_mask & ~core_samples_mask]
            plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), \
                     markeredgecolor='k', markersize=6)

        #plt.title('Estimated number of cell clusters for eps = '+str(e)+' and min_samples = '+str(n)+': %d' % n_clusters_)
        plt.xlabel("t-SNE dimension 1", fontsize='large')
        plt.ylabel("t-SNE dimension 2", fontsize='large')

        # optionally show the figure
        if show_flag == 1:
            plt.show()

        # save the figure
        plt.savefig(save_location+'cell_clusters_eps_'+str(e)+'_samples_'+str(n)+'.png')

        # if the figure was shown, close it
        if show_flag == 1:
            plt.close()

        # create a DBSCAN clustering of the nuclei with the set of parameters
        db = DBSCAN(eps=e, min_samples=n).fit(nuclei_data[nuclei_mapping].values)
        core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
        core_samples_mask[db.core_sample_indices_] = True
        labels = db.labels_
        cluster_results_nuclei['eps_'+str(e)+'_samples_'+str(n)] = labels
        n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
        n_noise_ = list(labels).count(-1)

        # print statistics
        print('Nuclei: Estimated number of clusters for eps = '+str(e)+' and min_samples = '+str(n)+': %d' % n_clusters_)
        print('Nuclei: Estimated number of noise points for eps = '+str(e)+' and min_samples = '+str(n)+': %d' % n_noise_)

        # create a figure
        plt.figure()
        unique_labels = set(labels)
        colors = [plt.cm.Spectral(each)
                  for each in np.linspace(0, 1, len(unique_labels))]
        for k, col in zip(unique_labels, colors):
            if k == -1:
                # Black used for noise.
                col = [0, 0, 0, 1]

            class_member_mask = (labels == k)

            xy = nuclei_data[nuclei_mapping].values[class_member_mask & core_samples_mask]
            plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), \
                     markeredgecolor='k', markersize=14)

            xy = nuclei_data[nuclei_mapping].values[class_member_mask & ~core_samples_mask]
            plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col), \
                     markeredgecolor='k', markersize=6)

        #plt.title('Estimated number of nuclei clusters for eps = '+str(e)+' and min_samples = '+str(n)+': %d' % n_clusters_)
        plt.xlabel("UMAP dimension 1", fontsize='large')
        plt.ylabel("UMAP dimension 2", fontsize='large')

        # optionally show the figure
        if show_flag == 1:
            plt.show()

        # save the figure
        plt.savefig(save_location+'nuclei_clusters_eps_'+str(e)+'_samples_'+str(n)+'.png')

        # if the figure was shown, close it
        if show_flag == 1:
            plt.close()

""" saving the clustered data """

cluster_results_cells.to_csv(save_location+'clustered_cell_data.csv')
cluster_results_nuclei.to_csv(save_location+'clustered_nuclei_data.csv')
help Creators and Submitter
Activity

Views: 1625   Downloads: 123

Created: 16th Oct 2020 at 12:19

Last updated: 16th Oct 2020 at 13:00

help Tags

This item has not yet been tagged.

help Attributions

None

Version History

Version 1 (earliest) Created 16th Oct 2020 at 12:19 by Maximilian Hillemanns

No revision comments

Powered by
(v.1.18.0)