আর-তে কোনও ফাংশন রয়েছে যা পাওয়া গেছে এমন ক্লাস্টারগুলির কেন্দ্রগুলিতে নিয়ে যায় এবং একটি নতুন ডেটা সেটে ক্লাস্টারগুলিকে নিয়োগ করে


14

আমার কাছে একটি বহুমাত্রিক ডেটা সেটের দুটি অংশ রয়েছে, আসুন তাদের কল করুন trainএবং test। এবং আমি ট্রেনের ডেটা সেটের ভিত্তিতে একটি মডেল তৈরি করতে চাই এবং তারপরে এটি পরীক্ষার ডেটা সেটটিতে বৈধতা দিতে চাই। গুচ্ছ সংখ্যা জানা যায়।

আমি আর-তে কে-মানে ক্লাস্টারিং প্রয়োগ করার চেষ্টা করেছি এবং আমি এমন একটি বস্তু পেয়েছি যাতে ক্লাস্টারগুলির কেন্দ্র রয়েছে:

kClust <- kmeans(train, centers=N, nstart=M)

আর-তে এমন কোনও ফাংশন রয়েছে যা পাওয়া গেছে এমন ক্লাস্টারগুলির কেন্দ্রগুলি নিয়ে যায় এবং আমার পরীক্ষার ডেটা সেটে ক্লাস্টারগুলিকে বরাদ্দ করে?

অন্যান্য পদ্ধতি / অ্যালগরিদমগুলি কী কী আমি চেষ্টা করতে পারি?


সাইটটিতে আপনাকে স্বাগতম, @ ব্যবহারকারী 2598356। আপনি কি আরও সাধারণ (নন-আর নির্দিষ্ট) উপায়ে ফ্রেম করতে পারেন? যদি আপনি কেবল একটি আর ফাংশন চাইছেন, তবে এই প্রশ্নটি সিভির জন্য অফ-টপিক হবে (আমাদের সহায়তা পৃষ্ঠাটি দেখুন )। তদুপরি, এটি স্ট্যাক ওভারফ্লোতেও অফ-টপিক হবে , কারণ এটির পুনরুত্পাদনযোগ্য উদাহরণ নেই । আপনি যদি বিষয়টিকে এখানে বা এসও-তে তৈরি করতে এটি সম্পাদনা করতে পারেন তবে দয়া করে এটি করুন। অন্যথায়, এই কিউ বন্ধ হতে পারে।
গুং - মনিকা পুনরায়

এই প্রশ্নটি অফ-টপিক হিসাবে উপস্থিত বলে মনে হচ্ছে কারণ এটি কোনও আর ফাংশন সন্ধান করার বিষয়ে।
গুং - মনিকা পুনরায়

1
তবে শেষ প্রশ্নটি কী: "আমি চেষ্টা করতে পারি এমন অন্যান্য পদ্ধতি / অ্যালগরিদমগুলি কী কী?" আসলে যে উত্তরটি আমি সিভির একটি বিষয়, সেগুলি প্রয়োগের বিষয়ে উদ্বেগ পেয়েছি বা আমি ভুল করছি?
ব্যবহারকারী 2598356

1
@ গুং আপনি ঠিকই থাকতে পারেন, সেক্ষেত্রে আমি এই ব্যবহারকারীকে 259 ... আমন্ত্রণ জানাচ্ছি ... মাইগ্রেশনের জন্য এই প্রশ্নটিকে পতাকাঙ্কিত করার জন্য। তবে অন্যান্য পদ্ধতি এবং অ্যালগরিদমগুলি সম্পর্কে প্রশ্নের শেষ অংশটি পরামর্শ দেয় যে আমাদের সম্প্রদায় দরকারী সহায়তা এবং পরামর্শ দেওয়ার মতো ভাল অবস্থানে থাকতে পারে।
whuber

ধন্যবাদ! ফাংশনটি ভালভাবে কাজ করে তবে আপনার 50k এর বেশি সারি থাকলে এটি খুব বেশি সময় নেয় takes এটিকে হালকা করার কোনও ধারণা?

উত্তর:


11

আপনি নিম্নলিখিত ফাংশন সহ একটি নতুন ডেটা সেট করার জন্য ক্লাস্টার অ্যাসাইনমেন্টগুলি গণনা করতে পারেন:

clusters <- function(x, centers) {
  # compute squared euclidean distance from each sample to each cluster center
  tmp <- sapply(seq_len(nrow(x)),
                function(i) apply(centers, 1,
                                  function(v) sum((x[i, ]-v)^2)))
  max.col(-t(tmp))  # find index of min distance
}

# create a simple data set with two clusters
set.seed(1)
x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
           matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
colnames(x) <- c("x", "y")
x_new <- rbind(matrix(rnorm(10, sd = 0.3), ncol = 2),
               matrix(rnorm(10, mean = 1, sd = 0.3), ncol = 2))
colnames(x_new) <- c("x", "y")

cl <- kmeans(x, centers=2)

all.equal(cl[["cluster"]], clusters(x, cl[["centers"]]))
# [1] TRUE
clusters(x_new, cl[["centers"]])
# [1] 2 2 2 2 2 1 1 1 1 1

plot(x, col=cl$cluster, pch=3)
points(x_new, col= clusters(x_new, cl[["centers"]]), pch=19)
points(cl[["centers"]], pch=4, cex=2, col="blue")

ক্লাস্টার অ্যাসাইনমেন্ট

অথবা আপনি ফ্লেক্সক্লাস্ট প্যাকেজটি ব্যবহার করতে পারেন , যা predictকে- মানেগুলির জন্য একটি বাস্তবায়িত পদ্ধতি রয়েছে:

library("flexclust")
data("Nclus")

set.seed(1)
dat <- as.data.frame(Nclus)
ind <- sample(nrow(dat), 50)

dat[["train"]] <- TRUE
dat[["train"]][ind] <- FALSE

cl1 = kcca(dat[dat[["train"]]==TRUE, 1:2], k=4, kccaFamily("kmeans"))
cl1    
#
# call:
# kcca(x = dat[dat[["train"]] == TRUE, 1:2], k = 4)
#
# cluster sizes:
#
#  1   2   3   4 
#130 181  98  91 

pred_train <- predict(cl1)
pred_test <- predict(cl1, newdata=dat[dat[["train"]]==FALSE, 1:2])

image(cl1)
points(dat[dat[["train"]]==TRUE, 1:2], col=pred_train, pch=19, cex=0.3)
points(dat[dat[["train"]]==FALSE, 1:2], col=pred_test, pch=22, bg="orange")

ফ্লেক্সক্লাস্ট প্লট

ক্লাস্টারের ফাংশনগুলি থেকে stats::kmeansবা cluster::pamশ্রেণীর অবজেক্টগুলিতে kccaএবং তদ্বিপরীতগুলিতে রূপান্তর করার জন্য রূপান্তর পদ্ধতিও রয়েছে :

as.kcca(cl, data=x)
# kcca object of family ‘kmeans’ 
#
# call:
# as.kcca(object = cl, data = x)
#
# cluster sizes:
#
#  1  2 
#  50 50 

আপনাকে অনেক ধন্যবাদ! কেবল একটি প্রশ্ন: কেসিসিএ পদ্ধতিগুলি শুরু সংখ্যার সাথে কীভাবে আচরণ করে (এটি কি প্রাথমিক শুরুর দিকের বিশ্লেষণটি অনুকূল করে তোলে)?
ব্যবহারকারী 2598356

শুরুর সংখ্যা বলতে কী বোঝ? stepFlexclustফাংশন ক্লাস্টার বিভিন্ন সংখ্যার জন্য বারবার আলগোরিদিম ক্লাস্টারিং চলে এবং প্রত্যেকের জন্য ক্লাস্টার দূরত্ব সমাধান মধ্যে সর্বনিম্ন ফেরৎ।
rcs

1

পদক্ষেপ 1: একটি ভেক্টর এবং ম্যাট্রিক্সের প্রতিটি সারির মধ্যে একটি ফাংশন কম্পিউটিং দূরত্ব

calc_vec2mat_dist = function(x, ref_mat) {
    # compute row-wise vec2vec distance 
    apply(ref_mat, 1, function(r) sum((r - x)^2))
}

পদক্ষেপ 2: এমন একটি ফাংশন যা ইনপুট_ম্যাট্রিক্সের প্রতিটি সারিটিতে vec2mat কম্পিউটার প্রয়োগ করে

calc_mat2mat_dist = function(input_mat, ref_mat) {

    dist_mat = apply(input_mat, 1, function(r) calc_vec2mat_dist(r, ref_mat))

    # transpose to have each row for each input datapoint
    # each column for each centroids
    cbind(t(dist_mat), max.col(-t(dist_mat)))
}

ধাপ 3. mat2mat ফাংশন প্রয়োগ করুন

calc_mat2mat_dist(my_input_mat, kmeans_model$centers)

Step4। বড় ডেটাসেটের জন্য mat2mat সমান্তরালভাবে বিকল্প হিসাবে প্লাইয়ার :: ddply এবং doMC ব্যবহার করুন

library(doMC)
library(plyr)

pred_cluster_para = function(input_df, center_mat, cl_feat, id_cols, use_ncore = 8) {
    # assign cluster lables for each individual (row) in the input_df 
    # input: input_df   - dataframe with all features used in clustering, plus some id/indicator columns
    # input: center_mat - matrix of centroid, K rows by M features
    # input: cl_feat    - list of features (col names)
    # input: id_cols    - list of index cols (e.g. id) to include in output 
    # output: output_df - dataframe with same number of rows as input, 
    #         K columns of distances to each clusters
    #         1 column of cluster_labels
    #         x column of indices in idx_cols

    n_cluster = nrow(center_mat)
    n_feat = ncol(center_mat)
    n_input = nrow(input_df)

    if(!(typeof(center_mat) %in% c('double','interger') & is.matrix(center_mat))){
        stop('The argument "center_mat" must be numeric matrix')
    } else if(length(cl_feat) != n_feat) {
        stop(sprintf('cl_feat size: %d , center_mat n_col: %d, they have to match!',length(cl_feat), n_feat))
    } else {
        # register MultiCore backend through doMC and foreach package
        doMC::registerDoMC(cores = use_ncore)

        # create job_key for mapping/spliting the input data
        input_df[,'job_idx'] = sample(1:use_ncore, n_input, replace = TRUE)

        # create row_key for tracing the original row order which will be shuffled by mapreduce
        input_df[,'row_idx'] = seq(n_input)

        # use ddply (df input, df output) to split-process-combine
        output_df = ddply(
            input_df[, c('job_idx','row_idx',cl_feat,id_cols)], # input big data 
            'job_idx',                       # map/split by job_idx
            function(chunk) {                # work on each chunk
                dist = data.frame(calc_mat2mat_dist(chunk[,cl_feat], center_mat))
                names(dist) = c(paste0('dist2c_', seq(n_cluster)), 'pred_cluster')
                dist[,id_cols] = chunk[,id_cols]
                dist[,'row_idx'] = chunk[,'row_idx']
                dist                        # product of mapper
                        }, .parallel = TRUE) # end of ddply
        # sort back to original row order

        output_df = output_df[order(output_df$row_idx),]
        output_df[c('job_idx')] = NULL
        return(output_df)
    }

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