বিএমসি ব্যবহার করে কেএমইএএনএস এর কে সংখ্যা অনুমান করতে


13

আমি বর্তমানে আমার খেলনা ডেটা সেট (অফসি আইরিস (:) এর জন্য বিআইসিকে গণনা করার চেষ্টা করছি here আমি এখানে প্রদর্শিত ফলাফলগুলি পুনরুত্পাদন করতে চাই (চিত্র 5) paper কাগজটিও বিআইসি সূত্রের জন্য আমার উত্স।

এতে আমার 2 টি সমস্যা রয়েছে:

  • স্বরলিপি:
    • এনআমি = ক্লাস্টারে থাকা উপাদানগুলির সংখ্যাআমি
    • সিআমি = ক্লাস্টারের কেন্দ্র স্থানাঙ্কআমি
    • এক্স = ক্লাস্টারে নির্ধারিত ডেটা পয়েন্টআমি
    • মি = ক্লাস্টারের সংখ্যা

1) এক্কে সংজ্ঞায়িত বৈকল্পিক। (2):

Σআমি=1এনআমি-মিΣ=1এনআমিএক্স-সিআমি2

আমি যতদূর দেখতে পাচ্ছি এটি সমস্যাযুক্ত এবং আচ্ছাদিত নয় যে ক্লাস্টারের উপাদানগুলির চেয়ে আরও বেশি ক্লাস্টার মি ভেরিয়েন্সটি নেতিবাচক হতে পারে । এটা কি সঠিক?

2) আমি ঠিক আমার কোডটি সঠিক BIC গণনা করতে পারি না। আশা করি কোনও ত্রুটি নেই, তবে কেউ চেক করতে পারলে এটির প্রশংসা হবে। পুরো সমীকরণটি এক্কে পাওয়া যাবে। (5) কাগজে। আমি এই মুহুর্তে সাইকিট শিখতে ব্যবহার করছি (কীওয়ার্ডটি যথাযথ করার জন্য: পি)।

from sklearn import cluster
from scipy.spatial import distance
import sklearn.datasets
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import numpy as np

def compute_bic(kmeans,X):
    """
    Computes the BIC metric for a given clusters

    Parameters:
    -----------------------------------------
    kmeans:  List of clustering object from scikit learn

    X     :  multidimension np array of data points

    Returns:
    -----------------------------------------
    BIC value
    """
    # assign centers and labels
    centers = [kmeans.cluster_centers_]
    labels  = kmeans.labels_
    #number of clusters
    m = kmeans.n_clusters
    # size of the clusters
    n = np.bincount(labels)
    #size of data set
    N, d = X.shape

    #compute variance for all clusters beforehand
    cl_var = [(1.0 / (n[i] - m)) * sum(distance.cdist(X[np.where(labels == i)], [centers[0][i]], 'euclidean')**2)  for i in xrange(m)]

    const_term = 0.5 * m * np.log10(N)

    BIC = np.sum([n[i] * np.log10(n[i]) -
           n[i] * np.log10(N) -
         ((n[i] * d) / 2) * np.log10(2*np.pi) -
          (n[i] / 2) * np.log10(cl_var[i]) -
         ((n[i] - m) / 2) for i in xrange(m)]) - const_term

    return(BIC)



# IRIS DATA
iris = sklearn.datasets.load_iris()
X = iris.data[:, :4]  # extract only the features
#Xs = StandardScaler().fit_transform(X)
Y = iris.target

ks = range(1,10)

# run 9 times kmeans and save each result in the KMeans object
KMeans = [cluster.KMeans(n_clusters = i, init="k-means++").fit(X) for i in ks]

# now run for each cluster the BIC computation
BIC = [compute_bic(kmeansi,X) for kmeansi in KMeans]

plt.plot(ks,BIC,'r-o')
plt.title("iris data  (cluster vs BIC)")
plt.xlabel("# clusters")
plt.ylabel("# BIC")

বিআইসির জন্য আমার ফলাফলগুলি এ রকম দেখাচ্ছে:

যা আমি প্রত্যাশা করেছিলাম তার কাছাকাছিও নয় এবং এটি কোনও বোধগম্যও নয় ... আমি কিছু সময়ের জন্য সমীকরণগুলির দিকে তাকিয়েছি এবং আমার ভুলটি আর খুঁজে পাচ্ছি না):


আপনি এখানে ক্লাস্টারিংয়ের জন্য বিআইসির গণনা পেতে পারেন । এটি এসপিএস এটি করে। আপনি যেমন দেখান ঠিক তেমনভাবে প্রয়োজন হয় না।
ttnphns

ধন্যবাদ ttnphns। আমি আপনার উত্তর আগে দেখেছি। তবে এর পদক্ষেপগুলি কীভাবে উত্পন্ন হয়েছিল এবং এটি কীভাবে আমি সন্ধান করছিলাম তার কোনও উল্লেখ নেই। তদুপরি এই এসপিএসএস আউটপুট বা সিনট্যাক্স যা কিছু তা খুব পঠনযোগ্য নয়। যাহোক তোমাকে ধন্যবাদ. এই প্রশ্নগুলির প্রতি আগ্রহের অভাবের কারণে আমি রেফারেন্সটি সন্ধান করব এবং ভিন্নতার জন্য অন্য একটি অনুমান ব্যবহার করব।
কাম সেন

আমি জানি এটি আপনার প্রশ্নের উত্তর দেয় না (এইভাবে আমি এটি একটি মন্তব্য হিসাবে রেখেছি), তবে আর প্যাকেজ এমক্লাস্ট সীমাবদ্ধ মিশ্রণের মডেলগুলিকে ফিট করে (একটি প্যারামেট্রিক ক্লাস্টারিং পদ্ধতি) এবং স্বয়ংক্রিয়ভাবে ক্লাস্টারগুলির সংখ্যা, আকার, আকার, অভিযোজন এবং বৈচিত্র্যকে অনুকূল করে তোলে। আমি বুঝতে পারছি আপনি স্কারার ব্যবহার করছেন তবে কেবল এটি বাইরে ফেলে দিতে চেয়েছিলেন।
ব্রাশ ভারসাম্য

1
ব্রাশ, স্কেলারনেও GMM রয়েছে
আইলারের

@ কামসেন আপনি কি আমাকে এখানে সাহায্য করতে পারবেন? : - stats.stackexchange.com/questions/342258/...
প্রণয় ওয়াংখেড়ে

উত্তর:


14

তুলনা করে নির্ধারিত হিসাবে আপনার সূত্রগুলিতে আপনার কয়েকটি ত্রুটি রয়েছে বলে মনে হয়:

1।

np.sum([n[i] * np.log(n[i]) -
               n[i] * np.log(N) -
             ((n[i] * d) / 2) * np.log(2*np.pi) -
              (n[i] / 2) * np.log(cl_var[i]) -
             ((n[i] - m) / 2) for i in range(m)]) - const_term

এখানে কাগজে তিনটি ত্রুটি রয়েছে, চতুর্থ এবং পঞ্চম লাইনগুলি ডি এর একটি ফ্যাক্টর হারিয়েছে, শেষ লাইনের বিকল্প মি। এর জন্য এটি হওয়া উচিত:

np.sum([n[i] * np.log(n[i]) -
               n[i] * np.log(N) -
             ((n[i] * d) / 2) * np.log(2*np.pi*cl_var) -
             ((n[i] - 1) * d/ 2) for i in range(m)]) - const_term

2।

কনস্টিমটারম:

const_term = 0.5 * m * np.log(N)

হতে হবে:

const_term = 0.5 * m * np.log(N) * (d+1)

3।

বৈকল্পিক সূত্র:

cl_var = [(1.0 / (n[i] - m)) * sum(distance.cdist(p[np.where(label_ == i)], [centers[0][i]], 'euclidean')**2)  for i in range(m)]

একটি স্কেলার হওয়া উচিত:

cl_var = (1.0 / (N - m) / d) * sum([sum(distance.cdist(p[np.where(labels == i)], [centers[0][i]], 'euclidean')**2) for i in range(m)])

4।

আপনার বেস 10 লগগুলির পরিবর্তে প্রাকৃতিক লগগুলি ব্যবহার করুন।

5।

শেষ অবধি, এবং সবচেয়ে বড় কথা, আপনি যে বিআইসির কম্পিউটিং করছেন তার নিয়মিত সংজ্ঞা থেকে একটি বিপরীত চিহ্ন রয়েছে। সুতরাং আপনি ছোট করার পরিবর্তে সর্বাধিক করার চেষ্টা করছেন


1
কেবল উল্লেখ করার জন্য, বিআইসি_নোটস ( https://github.com/bobhancock/goxmeans/blob/master/doc/BIC_notes.pdf ) এ, (21) থেকে (22) প্রাপ্ত সাইন পেয়েছেএমকে(φ)2

@eyaler আপনি এখানে আমাকে সংশোধন করতে পারেন? : - stats.stackexchange.com/questions/342258/...
প্রণয় ওয়াংখেড়ে

আপনি কি একটি কাগজ লিঙ্ক করতে পারেন, বা গাণিতিক মার্কআপ এ লিখতে পারেন?
ডোলান


@ Seanny123 এবং eyaler দয়া করে rnso থেকে পোস্ট stats.stackexchange.com/questions/374002/… দেখুন । এই সূত্রটি আইরিস ডেটাতে প্রায় 9 টি ক্লাস্টার দিচ্ছে যার 3 টি ক্লাস্টার থাকা উচিত
বার্নার্ডো ব্রাগা

11

এটি কয়েকটি নোট সহ মূলত আইলারের সমাধান someone কেউ যদি দ্রুত অনুলিপি / পেস্ট চান তবে আমি কেবল এটি টাইপ করেছি:

মন্তব্য:

  1. eyalers চতুর্থ মন্তব্য ভুল np.log ইতিমধ্যে একটি প্রাকৃতিক লগ, কোন পরিবর্তন প্রয়োজন

  2. বিপরীত সম্পর্কে আইলারের 5 তম মন্তব্যটি সঠিক। নীচের কোডটিতে আপনি ম্যাক্সিমামের সন্ধান করছেন - মনে রাখবেন যে উদাহরণটিতে নেতিবাচক বিআইসির সংখ্যা রয়েছে

কোডটি নিম্নরূপ (আবার আইলারের সকল ক্রেডিট):

from sklearn import cluster
from scipy.spatial import distance
import sklearn.datasets
from sklearn.preprocessing import StandardScaler
import numpy as np

def compute_bic(kmeans,X):
    """
    Computes the BIC metric for a given clusters

    Parameters:
    -----------------------------------------
    kmeans:  List of clustering object from scikit learn

    X     :  multidimension np array of data points

    Returns:
    -----------------------------------------
    BIC value
    """
    # assign centers and labels
    centers = [kmeans.cluster_centers_]
    labels  = kmeans.labels_
    #number of clusters
    m = kmeans.n_clusters
    # size of the clusters
    n = np.bincount(labels)
    #size of data set
    N, d = X.shape

    #compute variance for all clusters beforehand
    cl_var = (1.0 / (N - m) / d) * sum([sum(distance.cdist(X[np.where(labels == i)], [centers[0][i]], 
             'euclidean')**2) for i in range(m)])

    const_term = 0.5 * m * np.log(N) * (d+1)

    BIC = np.sum([n[i] * np.log(n[i]) -
               n[i] * np.log(N) -
             ((n[i] * d) / 2) * np.log(2*np.pi*cl_var) -
             ((n[i] - 1) * d/ 2) for i in range(m)]) - const_term

    return(BIC)



# IRIS DATA
iris = sklearn.datasets.load_iris()
X = iris.data[:, :4]  # extract only the features
#Xs = StandardScaler().fit_transform(X)
Y = iris.target

ks = range(1,10)

# run 9 times kmeans and save each result in the KMeans object
KMeans = [cluster.KMeans(n_clusters = i, init="k-means++").fit(X) for i in ks]

# now run for each cluster the BIC computation
BIC = [compute_bic(kmeansi,X) for kmeansi in KMeans]

print BIC

Github.com/bobhancock/goxmeans/blob/master/doc/BIC_notes.pdf- এর দিকে তাকালে আপনি কী ব্যাখ্যা করতে পারবেন যে এই বিআইসির সূত্রটি কীভাবে ম্যাক্সিমামের জন্য অপ্টিমাইজ করছে? আপনি কি সর্বনিম্নের জন্য প্রদর্শন করতে পারেন এবং এটি মৌখিক ভাষায় কী করে তা ব্যাখ্যা করতে পারেন? সূত্রটি ব্যাখ্যা করতে অসুবিধা হচ্ছে
ব্যবহারকারী 305883


1
সূত্রটিতে একটি বাগ আছে বলে মনে হচ্ছে। কেউ কি এটি ঠিক করতে পেরেছেন?
STIGMa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.