Python 如何使用sklearn为大型数据集利用关联传播

Python 如何使用sklearn为大型数据集利用关联传播,python,machine-learning,scikit-learn,cluster-analysis,tf-idf,Python,Machine Learning,Scikit Learn,Cluster Analysis,Tf Idf,我曾经用亲和传播为我的数据集创建集群,我的数据集相当大。我使用tfidf将文本数据集转换为向量,然后适应关联传播。对于较小的数据集,亲和性可以无缝地工作,但是对于较大的数据集,它开始消耗大量的RAM,最后,我的操作系统终止了这个过程。我做了很多研究,发现几乎没有堆栈溢出,它说使用np.medien或np.mean等。。但对我的问题不起作用。我还对组件进行了原理分析,并尝试减少矩阵,但仍然消耗了大量RAM。 我遇到了利用关联传播的方法——这种方法通过随机选择相似点而不是NXN来处理大型数据集,但在

我曾经用亲和传播为我的数据集创建集群,我的数据集相当大。我使用tfidf将文本数据集转换为向量,然后适应关联传播。对于较小的数据集,亲和性可以无缝地工作,但是对于较大的数据集,它开始消耗大量的RAM,最后,我的操作系统终止了这个过程。我做了很多研究,发现几乎没有堆栈溢出,它说使用np.medien或np.mean等。。但对我的问题不起作用。我还对组件进行了原理分析,并尝试减少矩阵,但仍然消耗了大量RAM。 我遇到了利用关联传播的方法——这种方法通过随机选择相似点而不是NXN来处理大型数据集,但在sklearn或python中找不到。 我看到它是一种语言。

我们如何在python中使用sklearn中的亲和传播

这是我正在尝试的一段亲和力代码

    def affinity_cluster_technique(self, preference=None, X_train_vecs=None, filenames=None, contents=None):
    """

    :param preference:
    :param X_train_vecs:
    :param vectorizer:
    :param filenames:
    :param contents:
    :return:
    """
    logger.info('Into the affinity core engine having the preference {}'.format(str(preference)))
    if X_train_vecs!=None or X_train_vecs!='None':
        X = X_train_vecs
        # X = cosine_distances(X)



        # svd = TruncatedSVD(n_components=100)
        # normalizer = Normalizer(copy=False)
        # lsa = make_pipeline(svd, normalizer)
        # X= X_train_vecs = lsa.fit_transform(X_train_vecs)

        # X = StandardScaler().fit_transform(X)
        logger.info("The shape of X_train after the lsa {}".format(X_train_vecs.shape))
        # X = X_train_vecs.toarray()
        # X = np.array(X)
        logger.info('Vector to array of the X data processed')
        if preference!='None':
            af = AffinityPropagation(damping=0.5, preference=preference,verbose=True)
        else:
            af = AffinityPropagation(damping=0.5, preference=None,verbose=True)
        logger.info('The affinity propagation object is {}'.format(str(af)))
        y = af.fit_predict(X)
        exemplars = af.cluster_centers_
        number_of_clusters = af.labels_.tolist()

        # logger.info("The total number of cluster Affinity generated is: {}".format(str(len(exemplars))))
        data = {'filename': filenames, 'contents': contents, 'cluster_label': number_of_clusters}
        frame = pd.DataFrame(data=data, index=[number_of_clusters], columns=['filename', 'contents', 'cluster_label'])
        logger.info('Sample of the clustered df {}'.format(str(frame.head(2))))
        cluster_and_count_of_docs = frame['cluster_label'].value_counts(sort=True, ascending=False)
        dict_of_cluster_and_filename = dict()

        for i in number_of_clusters:
            list_of_file_id = list()
            list_of_files_in_cluster = list()
            list_of_files_in_cluster = frame.ix[i]['filename'].tolist()
            try:
                for file_id in list_of_files_in_cluster:
                    list_of_file_id.append(file_id)
                dict_of_cluster_and_filename['clusters ' + str(i)] = list_of_file_id
            except Exception as e:
                list_of_file_id.append(list_of_files_in_cluster)
                dict_of_cluster_and_filename['clusters ' + str(i)] = list_of_file_id

        return dict_of_cluster_and_filename, X, y, exemplars
    else:
        try:
            raise Exception
        except Exception as e:
            logger.error("The X_train data is None {}".format(str(e)))
        return dict(),None,None,None

请让我知道,如果我正在做一些工作。。。并帮助了解如何实现大型数据集。

亲和传播需要2个n x n条目的矩阵。这种算法永远不会是可伸缩的。如果您有大量数据,请使用其他方法。图书馆建议与此无关。试着自己实现你想要的算法@尼特什库马尔:你能解决上述问题吗。我也在研究亲和传播问题。目前它的玩具输入。但随后我必须在120K+字符串上实现它。可能会面临同样的问题。