apache-spark - Java Spark:在分类数据的情况下为 aprroxNearestNeighbor 创建关键向量
问题描述
我正在尝试为分类数据集找到近似最近的邻居。为此,我正在使用MinHashLSH
Spark 中存在的模型。
我的数据集有分类数据。所以我使用StringIndexer
后跟OneHotEncoderEstimator
后跟VectorAssembler
将分类值转换为连续值。
现在我想从我的数据集中找到给定键的最近邻居,这个键应该是向量形式。我无法找到将分类键转换为连续向量的方法。
List<Row> dataA = Arrays.asList(RowFactory.create(0, "apple"),
RowFactory.create(1, "banana"),
RowFactory.create(2, "coconut"));
StructType schema = new StructType(
new StructField[] { new StructField("id", DataTypes.IntegerType, false, Metadata.empty()),
new StructField("fruits", DataTypes.StringType, false, Metadata.empty()) });
Dataset<Row> dfA = spark.createDataFrame(dataA, schema);
StringIndexer stringIndexer = new StringIndexer().setInputCol("fruits").setOutputCol("fruitIndex").setHandleInvalid("keep");
OneHotEncoderEstimator encoder = new OneHotEncoderEstimator().setInputCols(new String[]{"fruitIndex"}).setOutputCols(new String[]{"fruitVec"});
String[] featuredCols = new String[] {"fruitIndex","fruitVec"};
VectorAssembler assembler = new VectorAssembler().setInputCols(featuredCols).setOutputCol("features");
Pipeline sovPipeline = new Pipeline().setStages(new PipelineStage[]{stringIndexer, encoder, assembler});
// Feature Transformation
PipelineModel plModel = sovPipeline.fit(dfA);
Dataset<Row> dfT = plModel.transform(dfA);
MinHashLSH mh = new MinHashLSH().setNumHashTables(5).setInputCol("features").setOutputCol("hashes");
MinHashLSHModel model = mh.fit(dfT);
// model.approxNearestNeighbors(dfT, key, 2).show();
如何从分类键key
为方法创建(数字连续向量) ?approxNearestNeighbors
解决方案
您使用的Vector
数据应使用与训练数据相同的方法进行转换。由于Pipeline
模型不能处理单个项目,因此最快的解决方案是使用单个项目Dataset
:
import org.apache.spark.ml.linalg.Vector;
Vector key = plModel.transform(spark.createDataFrame(Arrays.asList(
RowFactory.create(0, "some key")), schema
)).first().getAs("features");
推荐阅读
- java - 完全透明的观察者
- c - 如何在 C 中创建地图?
- angular - Angular 库链接到 Angular 项目,但面临意外值错误
- sql-server - LINQ to Entity with left join
- google-analytics - 如何在测量协议 api 中发送基本地理数据?
- visual-studio-code - 我应该如何取消 jupyer notebook 中单元格的执行
当我运行一个单元格然后我想停止执行时,我不知道该怎么做:在 google collab 上,有一个小停止按钮,我们必须单击它来停止单元格(它会引发键盘中断)。在 Vscode 上,我发现了这个红色方块,但只有当我单击单元格顶部的“按行运行”时,这不是我想要做的......我发现这样做的唯一方法是杀死整个内核这也不是一个好主意
有没有办法停止单元格的
- ambari - 我们可以为上传/下载目的实现自定义 ambari 操作吗
- excel - Laravel ajax 返回 excel 而不是二进制字符串
- android - 如何从材料设计主题中删除操作栏高度?
- google-chrome-extension - 扩展是先运行还是脚本?