Я пытаюсь найти приблизительных ближайших соседей для категориального набора данных.Для этого я использую 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
из категориального ключа?