Как указать во время выполнения Число объектов (тип вектора) в кластеризации Kmeans с ML.Net - PullRequest
0 голосов
/ 02 мая 2019

Я хочу использовать алгоритм ML.Net Kmeans, но я не знаю во время компиляции размер набора данных или количество объектов.

Я вижу, что длина типа вектора должна бытьconst и, следовательно, попытка передать его в качестве аргумента не будет работать.

class Data
{ 
    public string ID{ get; set; }

    [VectorType(5)] //I do not know the if the data will contain 5 or more features
    public float[] Features { get; set; }   
}

Используется:

InputData row = new InputData { AssetID = Data[0, i + 1].ToString(), Features = features };

var context = new MLContext();
var DataView = context.Data.LoadFromEnumerable(dataArray);
string featuresColumnName = "Features";
var pipeline=context.Transforms.Concatenate(featuresColumnName,"Features")             .Append(context.Clustering.Trainers.KMeans(featuresColumnName, clustersCount: NumberClusters));

var model = pipeline.Fit(DataView);

1 Ответ

0 голосов
/ 09 мая 2019

Если размерность вектора фиксирована, вы можете обойти ее во время выполнения:

 private class SampleTemperatureDataVector
    {
        public DateTime Date { get; set; }
        public float[] Temperature { get; set; }
    }

обратите внимание, что этот тип не имеет аннотаций. Вы можете создать SchemaDefinition из него, а затем изменить эту схему. Начальное SchemaDefinition будет иметь свойство IsKnownSize, установленное на false. После модификации Size будет установлен в размер, который вы установили, 3 в этом случае.

        var data2 = new SampleTemperatureDataVector[]
        {
            new SampleTemperatureDataVector
            {
                Date = DateTime.UtcNow, 
                Temperature = new float[] {1.2f, 3.4f, 5.6f}
            },
             new SampleTemperatureDataVector
            {
                Date = DateTime.UtcNow,
                Temperature = new float[] {1.2f, 3.4f, 5.6f}
            },
        };

        int featureDimension = 3;
        var autoSchema = SchemaDefinition.Create(typeof(SampleTemperatureDataVector));
        var featureColumn = autoSchema[1];
        var itemType = ((VectorDataViewType)featureColumn.ColumnType).ItemType;
        featureColumn.ColumnType = new VectorDataViewType(itemType, featureDimension);

        IDataView data3 = mlContext.Data.LoadFromEnumerable(data2, autoSchema);
...