static DynamicKMeans TrainModel(List <Song> songs, int clustersCount)
        {
            DynamicKMeans kMeans = new DynamicKMeans(songs, clustersCount);

            kMeans.Clusterize();
            // ConsoleHelper.ShowClusters(kMeans);

            return(kMeans);
        }
        public static void Main(string[] args)
        {
            AppConfig appConfig = FileSystemHelper.GetAppConfig();
            DateTime  runDate   = GetRunDate();

            List <Song> songs = GetPreparedTrainingData();

            int experimentIndex = 0;

            foreach (ExperimentConfig config in appConfig.ExperimentConfigs)
            {
                for (int i = 0; i < config.ModelsCount; i++)
                {
                    DynamicKMeans trainedKMeans = TrainModel(songs, config.ClustersCount);
                    FileSystemHelper.SaveKMeansModel(trainedKMeans.Model, runDate, experimentIndex);

                    experimentIndex += 1;
                }
            }

            List <StaticKMeans> models = ReadAllModels(songs);

            List <ModelAnalyzer> analyzers = models.Select(model =>
            {
                ModelAnalyzer analyzer = new ModelAnalyzer(model);
                analyzer.Analyze();

                return(analyzer);
            }).ToList();

            AnalysisDrawer drawer = new AnalysisDrawer(analyzers);

            drawer.CreatePlots();
            FileSystemHelper.SaveAnalysis(drawer, runDate);

            List <Song> analyzingSongs = GetAnalyzingSongs();

            FileSystemHelper.ClearPredictions();

            for (int i = 0; i < models.Count; i++)
            {
                StaticKMeans      model       = models[i];
                List <Prediction> predictions = MakePredictions(model, analyzingSongs);
                FileSystemHelper.SavePredictions(predictions, runDate, i);
            }
        }