Plot ini menggambarkan bagaimana pengelompokan dipengaruhi oleh penghapusan titik data acak. Hasilnya menunjukkan konsistensi yang kuat dalam pengelompokan, menggunakan k=4. Grup tetap konsisten selama iterasi dan menjaga struktur menyeluruh, di mana Anda dapat dengan jelas melihat bahwa titik-titik yang bersama dalam iterasi sebelumnya tetap dikelompokkan bersama # Memilih k sebagai 4 X = df [ . ['phi', 'psi']] scaler = StandardScaler() X = scaler. fit_transform ( X ) random_init . = [0, 1, 2, 3, 4, 5] plots = len(random_init) fig, axs = plt. subplot (1, plot . , figsize=(20,4)) for i in range(0, plots): kmeans = KMeans ( n_clusters . = k, random_state = i) y_pred = kmeans. fit_predict ( X ) kapak . [i]. menyebar ( X [. ,0], X . [:,1], c . = y_pred, cmap= 'gist_rainbow', edgecolor='black', s = 20) axs[i]. menyebar ( kberarti . cluster_centers_ [. , 0], kmeans . . cluster_centers_ [. , 1], penanda . = 'x',c = 'black') axs[i]. set_title (f'Status acak {i}') plt. tight_layout () plt . tampilkan () Plot menampilkan konsistensi yang luar biasa dalam pengelompokan, saat menggunakan 4 grup, terlepas dari posisi awal centroid dalam algoritme K-means. Ini berbicara sangat tinggi tentang konsistensi k = 4 dan validitas cluster X = df [['phi', 'psi']] k_values = range(2, 8) k_opt = 0 high_score = 0 for k in k_values: kmeans = KMeans ( n_clusters . = k, random_state = 0). cocok ( X ) label . = kmeans. skor label_ = metrik . siluet_score ( X , label . , metric = 'euclidean') print(f"Silhoutte score for k = {k} is: { skor }") . if (score > high_score): k_opt = k skor_tinggi = . print(f"The optimal silhoutte score is for k = {k_opt} and is: { skor_tinggi }") Skor siluet berkisar dari -1 hingga 1. Nilai yang mendekati 1 menunjukkan metode pengelompokan yang baik. Mencari berbagai saran untuk k (mulai dari 2 hingga 8) kami menemukan bahwa k=3 dan k=4 memberikan skor sihoutte terbaik, karena sangat mirip sehingga sulit untuk membuat penilaian. Menggunakan temuan dari 'metode siku' dan inspeksi visual plot, kami memilih k=4 sebagai yang paling cocok df_mod = df . salin () df_mod [ . 'phi']=(df['phi']+360)%360 df_mod['psi']=(df['psi']+360)%360 # Extracting the variables X_phi_mod = df_mod['phi'] X_psi_mod = df_mod['psi'] # Making a scatterplot plt. angka ( figsize =( . 14,9)) plt. pencar ( X_phi_mod , X_psi_mod . , s = 10, c = 'darkcyan', label = 'Distribution of phi and psi') plt. kisi (Benar) plt . . title ('Distribusi kombinasi Phi dan Psi untuk molekul protein (digeser 360 derajat)') plt. xlabel ('Phi, dalam derajat') plt. ylabel ('Psi, dalam derajat') plt. legenda ( loc =' . ) plt. tampilkan () X = df_mod [['phi', 'psi']] X = StandardScaler(). fit_transform ( X ) k_values . = range(2, 8) for value in k_values: kmeans_clustering ( X , nilai ) Tampaknya kecocokan yang paling intuitif sekarang adalah 3 cluster. Mari kita lihat bagaimana tampilan skor siluetnya. Mari kita bandingkan k=3 dan k=4 (mana yang paling efektif sebelum menggeser kumpulan data) X = df_mod [['phi', 'psi']] k_values = [3, 4] k_opt=0 high_score = 0 for k in k_values: kmeans = KMeans ( n_clusters . =k, random_state=0). cocok ( X ) label . = kmeans. skor label_ = metrik . siluet_score ( X , label . , metric='euclidean') print(f"Silhoutte score for k = {k} is: { skor }") . if (score > high_score): k_opt = k high_score = . print(f"The optimal silhoutte score is for k = {k_opt} and is: { skor_tinggi }") Skor siluet jelas tidak optimal untuk k=3 sebagai gantinya. Yang konsisten dengan tampilan grafis di atas dari sklearn . cluster impor DBSCAN dari sklearn . import metrics from sklearn. pemrosesan awal impor StandardScaler dari sklearn . . tetangga impor NearestNeighbours impor koleksi X = df [['phi', 'psi']] scaler = StandardScaler() X = scaler. fit_transform ( X ) # Fungsi untuk membuat dan memplot DBSCAN untuk nilai eps dan min_samples yang berbeda def createDBSCAN( . 5X, eps = 0.5, min_samples = 100 . add_bar_plot = False): # Menyesuaikan dan memprediksi nilai yang diberikan disediakan untuk eps dan min_samples dbscan = DBSCAN . (eps = eps, min_samples = min_samples) y = dbscan. fit_predict ( X ) label . = dbscan. labels_ # Jumlah cluster dalam label, abaikan noise jika ada. n_clusters_ = len(set . (labels)) - (1 if -1 in labels else 0) n_noise_ = list(labels). hitung (-1) . %d' print('Estimated number of clusters: %d' % n_clusters_ ) cetak('Estimated number of noise points: %d' % n_noise_ ) outliers_df = df[labels == -1] clusters_df = df[labels != -1] color_clusters . = labels[labels != -1] color_outliers . 'black' plt. angka ( figsize =( . 7,4)) plt. menyebar ( clusters_df [' . ], clusters_df['psi'], c = color_clusters, edgecolors = 'black', cmap='gist_rainbow', s = 30) plt. menyebar ( outliers_df [' . ], outliers_df['psi'],c = color_outliers, edgecolors = 'black', label = 'Outliers', s = 30) plt. judul (f"Poin data dengan DBSCAN, sampel minimum. { min_samples }, eps. { eps }") . plt. xlabel ('Phi, dalam derajat') plt. label ('Psi, dalam derajat') plt. legenda ( loc =' . ) plt. tampilkan () jika add_bar_plot . == True: bar = outliers_df [' . ]. jumlah_nilai ( urutkan =Benar . ). plot . bar () bar . set_title ('Jenis residu asam amino yang paling sering outlier') . 5 dan nilai yang berbeda untuk min_samples # Tryng the function with eps = 0.5 and different values for min_samples createDBSCAN ( X , min_samples = 10) createDBSCAN(X, min_samples = 100) createDBSCAN(X, min_samples = 500) # Sampel minimum untuk diuji min_samples = [200, 250, 300] color_list = ['orchid', 'darkcyan', 'darkviolet'] i = 0 for value in min_samples: tetangga = Tetangga Terdekat ( n_tetangga . = value) # Fitting NearestNeighbors to the data nbrs = neigh. cocok ( X ) # . distances, indices = nbrs. kneighbors ( X ) jarak . = np. urutkan ( jarak , sumbu . =0) distances = distances[:,1] plt . plot ( jarak , c . = color_list[i], linewidth = 3) plt. xlabel ('Jumlah poin') plt. ylabel ('Jarak Rata-Rata') plt. title (f'Menemukan ep optimal, # tetangga terdekat. { nilai }') . plt. kisi (Benar) plt . . tampilkan () i = i + 1 eps = [0. 3, 0. 4, 0. 5] untuk i di . : cetak(f'DBSCAN dengan eps = {i} and various values for min_samples') for j in min_samples: createDBSCAN ( X , eps = i, min_samples = j)
# Merencanakan klaster yang ditemukan dengan DBSCAN dengan epsilon = 0. 4 dan min_samples = 150 createDBSCAN ( X , 0.4, 200, Benar) print('Untuk data yang tidak diterjemahkan, k = 4 optimal') kmeans_clustering(X, 4) createDBSCAN(X, 0.4, 200) pro_df = df [(df['residue name'] == 'PRO')]. salin () X = . pro_df[['phi', 'psi']] X = StandardScaler(). fit_transform ( X ) min_samples . 5 = 200 eps = 0.5 # Menyesuaikan dan memprediksi nilai yang diberikan disediakan untuk eps dan min_samples dbscan = . (eps = eps, min_samples = min_samples) y = dbscan. fit_predict ( X ) label . = dbscan. labels_ # Jumlah cluster dalam label, abaikan noise jika ada. n_clusters_ = len(set . (labels)) - (1 if -1 in labels else 0) n_noise_ = list(labels). hitung (-1) . %d' print('Estimated number of clusters: %d' % n_clusters_ ) cetak('Estimated number of noise points: %d' % n_noise_ ) outliers_df = pro_df[labels == -1] clusters_df = pro_df[labels != -1] color_clusters . = labels[labels != -1] color_outliers . 'black' plt. angka ( figsize =( . 7,4)) plt. menyebar ( clusters_df [' . ], clusters_df['psi'], c = color_clusters, edgecolors = 'black', cmap='gist_rainbow', s = 30) plt. menyebar ( outliers_df [' . ], outliers_df['psi'],c = color_outliers, edgecolors = 'black', label = 'Outliers', s = 30) plt. title (f"Titik data dengan DBSCAN untuk PRO, sampel minimum. { min_samples }, eps. { eps }") . plt. xlabel ('Phi, dalam derajat') plt. ylabel ('Psi, dalam derajat') plt. legenda ( loc =' . ) plt. tampilkan () Parameter awal tampaknya menghasilkan hasil yang konsisten, bahkan sedikit memvariasikannya tidak memengaruhi solusi Pengelompokan yang hanya menggunakan tipe residu PRO berbeda dari pengelompokan DBSCAN umum karena tidak memiliki kluster dengan nilai Phi positif. Selain itu, ini menghasilkan dua klaster yang terdefinisi dengan baik, dan tidak menemukan nilai apa pun di pojok kiri atas, yang sangat lazim di klaster DBSCAN sebelumnya. Ini menarik, karena DBSCAN sepertinya tidak pernah mengelompokkan titik-titik yang tepat ini, namun, untuk k besar, algoritme k berarti tampaknya menemukan kluster ini (ditemukan dalam tipe residu PRO) lebih akurat pro_df = df [(df['residue name'] == 'GLY')]. salin () X = . pro_df[['phi', 'psi']] X = StandardScaler(). fit_transform ( X ) min_samples . 5 = 200 eps = 0.5 # Menyesuaikan dan memprediksi nilai yang diberikan disediakan untuk eps dan min_samples dbscan = . (eps = eps, min_samples = min_samples) y = dbscan. fit_predict ( X ) label . = dbscan. labels_ # Jumlah cluster dalam label, abaikan noise jika ada. n_clusters_ = len(set . (labels)) - (1 if -1 in labels else 0) n_noise_ = list(labels). hitung (-1) . %d' print('Estimated number of clusters: %d' % n_clusters_ ) cetak('Estimated number of noise points: %d' % n_noise_ ) outliers_df = pro_df[labels == -1] clusters_df = pro_df[labels != -1] color_clusters . = labels[labels != -1] color_outliers . 'black' plt. angka ( figsize =( . 7,4)) plt. menyebar ( clusters_df [' . ], clusters_df['psi'], c = color_clusters, edgecolors = 'black', cmap='gist_rainbow', s = 30) plt. menyebar ( outliers_df [' . ], outliers_df['psi'],c = color_outliers, edgecolors = 'black', label = 'Outliers', s = 30) plt. title (f"Titik data dengan DBSCAN untuk GLY, sampel minimum. { min_samples }, eps. { eps }") . plt. xlabel ('Phi, dalam derajat') plt. ylabel ('Psi, dalam derajat') plt. legenda ( loc =' . ) plt. tampilkan () Parameter awal tampaknya menghasilkan hasil yang konsisten, bahkan sedikit memvariasikannya tidak memengaruhi solusi Jenis residu GLY tampaknya lebih mewakili kelompok yang ditemukan dalam kasus umum. Kami melihat satu cluster dengan phi>0, kami menemukan cluster di kiri atas dan kiri tengah. Namun, beberapa titik data berada di cluster yang tersisa yang ditemukan dalam kasus umum, namun ini dianggap outlier dengan metode DBSCAN Penting untuk mempertimbangkan bahwa dalam tugas sebelumnya kami menemukan bahwa residu GLY memiliki jumlah outlier tertinggi, dengan berbagai faktor. Ini dapat ditampilkan dalam pengelompokan residu GLY saja, karena kita dapat melihat tidak ada kelompok yang jelas, tampaknya ada titik data di setiap kuadran grafik, dan beberapa hampir tersebar secara acak
|