1. 程式人生 > >spark LDA聚類演算法的例子

spark LDA聚類演算法的例子

LDA是狄利克雷分佈演算法,一般用於海量文件主題聚類。一般每個文件都有一個隱藏的主題,LDA演算法就是找出可能性最高的幾個主題。在找出主題的同時,也就找到了文件中每個單詞在主題中的分佈概概率。可以參考http://blog.csdn.net/qq_34531825/article/details/52608003

下面是LDA演算法的例子。該例子參考了官方網站中的例子。例子中的資料如下:

0 1:1 2:2 3:6 4:0 5:2 6:3 7:1 8:1 9:0 10:0 11:3
1 1:1 2:3 3:0 4:1 5:3 6:0 7:0 8:2 9:0 10:0 11:1
2 1:1 2:4 3:1 4:0 5:0 6:4 7:9 8:0 9:1 10:2 11:0
3 1:2 2:1 3:0 4:3 5:0 6:0 7:5 8:0 9:2 10:3 11:9
4 1:3 2:1 3:1 4:9 5:3 6:0 7:2 8:0 9:0 10:1 11:3
5 1:4 2:2 3:0 4:3 5:4 6:5 7:1 8:1 9:1 10:4 11:0
6 1:2 2:1 3:0 4:3 5:0 6:0 7:5 8:0 9:2 10:2 11:9
7 1:1 2:1 3:1 4:9 5:2 6:1 7:2 8:0 9:0 10:1 11:3
8 1:4 2:4 3:0 4:3 5:4 6:2 7:1 8:3 9:0 10:0 11:0
9 1:2 2:8 3:2 4:0 5:3 6:0 7:2 8:0 9:2 10:7 11:2
10 1:1 2:1 3:1 4:9 5:0 6:2 7:2 8:0 9:0 10:3 11:3
11 1:4 2:1 3:0 4:0 5:4 6:5 7:1 8:3 9:0 10:1 11:0

程式碼如下:

package spark;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.spark.ml.clustering.LDA;
import org.apache.spark.ml.clustering.LDAModel;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SparkSession;

import scala.collection.mutable.WrappedArray;

public class JavaLDAExample {

	public static void main(String[] args) {

		Logger logger = Logger.getLogger(JavaLDAExample.class);
		// 設定日誌的等級 並關閉jetty容器的日誌
		Logger.getLogger("org.apache.spark").setLevel(Level.WARN);
		Logger.getLogger("org.apache.eclipse.jetty.server").setLevel(Level.OFF);
		SparkSession spark = SparkSession.builder().master("local[2]").appName("JavaLDAExample").getOrCreate();
		
		//載入資料,資料是標籤向量。標籤可以看作是文件序號。文件格式為:   文件序號  矩陣列序號:文件中的單詞
		Dataset<Row> dataset = spark.read().format("libsvm")
				.load("F:/spark-2.1.0-bin-hadoop2.6/data/mllib/sample_lda_libsvm_data.txt");
		dataset.foreach(func -> {
			System.out.println(func);
		});

		// 訓練lda模型
		LDA lda = new LDA().setK(3).setMaxIter(10);
		LDAModel model = lda.fit(dataset);
		// log likelihood,越大越好。
		double ll = model.logLikelihood(dataset);
		// Perplexity評估,越小越好
		double lp = model.logPerplexity(dataset);
		System.out.println("The lower bound on the log likelihood of the entire corpus: " + ll);
		System.out.println("The upper bound on perplexity: " + lp);

		org.apache.spark.ml.linalg.Matrix matrix = model.topicsMatrix();
		System.out.println("------------------------");
		System.out.println("矩陣topics列為主題,總共有" + matrix.numCols() + "主題");
		System.out.println("矩陣topics行為單詞,總共有" + matrix.numRows() + "單詞");

		System.out.println("矩陣topics表示的是每個單詞在每個主題中的權重");
		for (int topic = 0; topic < 3; topic++) {
			System.out.print("Topic " + topic + ":");
			for (int word = 0; word < model.vocabSize(); word++) {
				System.out.print(" " + matrix.apply(word, topic));
			}
			System.out.println();
		}

		System.out.println("------------------------");

		Dataset<Row> topicss = model.describeTopics();
		topicss.foreach(func -> {
			int topic = func.getInt(0);
			WrappedArray<Long> words = (WrappedArray<Long>)func.get(1);
			WrappedArray<Double> distributes = (WrappedArray<Double>)func.get(2);
			System.out.print("主題 " + topic + ",單詞(按照概率從高到低排布)[");
			for (int i = 0; i < words.length(); i++) {
				System.out.print(words.apply(i) + " ");
			}
			System.out.print("],分佈概率[");
			for (int i = 0; i < distributes.length(); i++) {
				System.out.print(distributes.apply(i) + " ");
			}
			System.out.print("]\n");
		});

		System.out.println("------------------------");
		// 描述主題只展示概率前三的單詞
		Dataset<Row> topics = model.describeTopics(3);
		System.out.println("The topics described by their top-weighted terms:");
		topics.show(false);

		// 對文件進行聚類,並展示主題分佈結果。lable表示的是文件的序號
		Dataset<Row> transformed = model.transform(dataset);
		transformed.show(false);

		double[] arr = model.getEffectiveDocConcentration();
		for (double d : arr) {
			System.out.println(d);
		}

		//System.out.println(model.getTopicConcentration());
		spark.stop();
	}
}


相關推薦

spark LDA演算法例子

LDA是狄利克雷分佈演算法,一般用於海量文件主題聚類。一般每個文件都有一個隱藏的主題,LDA演算法就是找出可能性最高的幾個主題。在找出主題的同時,也就找到了文件中每個單詞在主題中的分佈概概率。可以參考http://blog.csdn.net/qq_34531825/arti

Spark演算法LDA主題模型演算法

Spark上實現LDA原理LDA主題模型演算法Spark實現LDA的GraphX基礎在Spark 1.3中,MLlib現在支援最成功的主題模型之一,隱含狄利克雷分佈(LDA)。LDA也是基於GraphX上構建的第一個MLlib演算法,GraphX是實現它最自然的方式。有許多演

Hadoop/MapReduce 及 Spark KMeans演算法實現

package kmeans; import java.io.BufferedReader; import java.io.DataInput; import java.io.DataOutput; import java.io.File; import java.io.

大資料:Spark mlib(一) KMeans演算法原始碼分析

1. 聚類1.1 什麼是聚類?所謂聚類問題,就是給定一個元素集合D,其中每個元素具有n個可觀察屬性,使用演算法將集合D劃分成k個子集,要求每個子集內部的元素之間相異度儘可能低,而不同子集的元素相異度儘可能高,其中每個子集叫做一個簇。1.2 KMeans 聚類演算法K-Mean

SparkMllib GMM演算法的理解以及例子

在完成sparkMllib GMM演算法例子之前需要知道幾個概念。1、高斯分佈、2、多維高斯分佈。3、高斯混合分佈。4、協方差 GMM稱為混合高斯分佈,它在單高斯分佈(又稱正太分佈,一維正太分佈)的基礎上針對多元變數發展出來的。(以下參考了百度詞條內容) 1)單高斯分佈公式

Spark機器學習之-實時演算法呼叫

Spark MLIB中的Kmenas聚類演算法,資料通過SparkStreaming 實時拉取kafka中的資料,並呼叫已經訓練好的聚類模型;根據讀取的資料實時的進行分類package com.demo.cn.streaming import org.apache.kafk

spark.mllib原始碼閱讀-演算法1-KMeans

KMeans聚類是聚類分析比較簡單的一種,由於其簡單、高效、易於理解實現等優點被廣泛用於探索性資料分析中。關於KMeans演算法的介紹、分析的相關文章可謂汗牛充棟,留給我能寫的東西並不多了,在這裡,我通過羅列相關文章的方式,將涉及KMeans聚類的各方面做一個儘量詳盡的總結。

Spark中的演算法

# Spark - Clustering 官方文件:https://spark.apache.org/docs/2.2.0/ml-clustering.html 這部分介紹MLlib中的聚類演算法; 目錄: - K-means: - 輸入列; - 輸出列; - Latent Dirichlet

Spark MLlib中KMeans演算法的解析和應用

聚類演算法是機器學習中的一種無監督學習演算法,它在資料科學領域應用場景很廣泛,比如基於使用者購買行為、興趣等來構建推薦系統。 核心思想可以理解為,在給定的資料集中(資料集中的每個元素有可被觀察的n個屬性),使用聚類演算法將資料集劃分為k個子集,並且要求每個子集內部的元素之間的差異度儘可能低,而不同子集元素的差

【神經網路】自編碼演算法--DEC (Deep Embedded Clustering)

1.演算法描述      最近在做AutoEncoder的一些探索,看到2016年的一篇論文,雖然不是最新的,但是思路和方法值得學習。論文原文連結 http://proceedings.mlr.press/v48/xieb16.pdf,論文有感於t-SNE演算法的t-

演算法之DBSCAN演算法之二:高維資料剪枝應用NQ-DBSCAN

一、經典DBSCAN的不足 1.由於“維度災難”問題,應用高維資料效果不佳 2.執行時間在尋找每個點的最近鄰和密度計算,複雜度是O(n2)。當d>=3時,由於BCP等數學問題出現,時間複雜度會急劇上升到Ω(n的四分之三次方)。 二、DBSCAN在高維資料的改進 目前的研究有

演算法之DBSCAN演算法之一:經典DBSCAN

DBSCAN是基於密度空間的聚類演算法,與KMeans演算法不同,它不需要確定聚類的數量,而是基於資料推測聚類的數目,它能夠針對任意形狀產生聚類。 1.epsilon-neighborhood epsoiln-neighborhood(簡稱e-nbhd)可理解為密度空間,表示半徑為e

機器學習——K-means演算法演算法

聚類 在說K-means聚類演算法之前必須要先理解聚類和分類的區別。 分類其實是從特定的資料中挖掘模式,作出判斷的過程。比如Gmail郵箱裡有垃圾郵件分類器,一開始的時候可能什麼都不過濾,在日常使用過程中,我人工對於每一封郵件點選“垃圾”或“不是垃圾”,過一段時間,Gmail就體現出

演算法(1)

一聚類演算法簡介 1.聚類和分類的區別 聚類 - 利用演算法將相似或者相近的樣本聚成一簇,這些樣本都是無標籤的,是一種無監督學習演算法。 分類 - 首先需要從有標籤樣本學習出打標籤邏輯,再利用學習出的邏輯對無標籤樣本進行分類,是一種有監督學習演算法。 2.聚類的使用 聚類演

機器學習筆記之(7)——演算法

對於監督學習,訓練資料都是事先已知預測結果的,即訓練資料中已提供了資料的類標。無監督學習則是在事先不知道正確結果(即無類標資訊或預期輸出值)的情況下,發現數據本身所蘊含的結構等資訊。 無監督學習通過對無標記訓練樣本的學習來尋找這些資料的內在性質。 聚類的目標是發現數據中自然形成的分組,使得每

機器學習實戰(Machine Learning in Action)學習筆記————06.k-均值演算法(kMeans)學習筆記

機器學習實戰(Machine Learning in Action)學習筆記————06.k-均值聚類演算法(kMeans)學習筆記關鍵字:k-均值、kMeans、聚類、非監督學習作者:米倉山下時間:2018-11-3機器學習實戰(Machine Learning in Action,@author: Pet

演算法-K-means

K-means演算法****** 步驟: 1.從訓練資料中隨機選取k個初始點,作為k個初始簇的中心點 2.計算每個點到中心點的歐式距離,將其歸併到距離最近的簇中,直至所有點劃分完成 3.計算每個簇新的中心點 4.如果相對於原來中心點沒有變化或者變化數值小於給定閾值,則演算

吳恩達老師機器學習筆記K-means演算法(二)

運用K-means聚類演算法進行影象壓縮 趁熱打鐵,修改之前的演算法來做第二個練習—影象壓縮 原始圖片如下: 程式碼如下: X =imread('bird.png'); % 讀取圖片 X =im2double(X); % unit8轉成double型別 [m,n,z]=size

吳恩達老師機器學習筆記K-means演算法(一)

今天接著學習聚類演算法 以後堅決要八點之前起床學習!不要浪費每一個早晨。 K-means聚類演算法聚類過程如下: 原理基本就是先從樣本中隨機選擇聚類中心,計算樣本到聚類中心的距離,選擇樣本最近的中心作為該樣本的類別。最後某一類樣本的座標平均值作為新聚類中心的座標,如此往復。 原

DBSCAN演算法難嗎?我們來看看吧~

往期經典回顧 從零開始學Python【29】--K均值聚類(實戰部分) 從零開始學Python【28】--K均值聚類(理論部分) 從零開始學Python【27】--Logistic迴歸(實戰部分) 從零開始學Python【26】--Logistic迴歸(理論部分) 從零開始學Py