Тип: КолонкиАнализаДанных. Содержит настройку колонок источника данных.
Полное описание, параметры и ограничения
РезультатАнализаДанныхКластеризация.НастройкаКолонок (DataAnalysisClusterizationResult.ColumnsSetting)
РезультатАнализаДанныхКластеризация (DataAnalysisClusterizationResult)
НастройкаКолонок (ColumnsSetting)
Доступен, начиная с версии 8.0.
Использование:
Только чтение.
Описание:
Тип: КолонкиАнализаДанных.
Содержит настройку колонок источника данных.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Взвесить X/Y, разобрать настоящую нормализацию и спрогнозировать кластеры двух новых точек
Полный самостоятельный серверный модуль обучается на шести собственных точках, задает веса 2/1 реальным дополнительным параметрам, читает карту нормализации и выполняет прогноз отдельной таблицы. Координаты и ключи результата сопоставляются с собственным источником, номера групп не выдумываются.
Где и как запускать
Полный серверный общий модуль УчебныйНовыйКластер85 собственной пустой конфигурации; все помощники включены. Не запускался в 1С.
Подготовка
НОВАЯ отдельная пустая файловая база точно 8.5.1.1343: конфигурация УчебныйНовыйКластер85, совместимость Не использовать, Русский. Нет прикладных объектов, расширений, подписок и заданий; модули конфигурации вручную пустые. Не использовать БП/КА2/УТ/УНФ.
Общие → Общие модули → УчебныйНовыйКластер85. Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить весь основной модуль, включая собственную подготовку, все помощники и защиту. Будущая ручная подготовка: сохранить и обновить только свою базу F7.
Создать свою внешнюю обработку и управляемую Форма: команда/кнопка Выполнить, действие Выполнить. Полный модуль формы ниже вызывает только собственный общий модуль и получает текст отчета; модель и таблицы на клиент не передаются.
Собственная обучающая таблица содержит шесть координат: (0,0), (0,1), (1,0), (10,10), (10,11), (11,10), с отдельными own-training-point-кодами. Код — дискретный ключ, X/Y — непрерывные входы. Таблицы и модель создаются только в памяти. Данные вымышленные, не клиенты и не географические координаты.
Код отдельно создает две новые точки (0.5,0.5) и (10.5,10.5) с другими own-new-point-кодами. В них нет готового номера кластера. Обучение не повторяется на новых строках.
Вес X=2 и Y=1 — выбранный учебный профиль влияния входных координат. КоличествоКластеров=2, МетодКластеризации=ДальняяСвязь, ТипЗаполненияТаблицы=ВсеПоля. Имена параметров и readonly/RW сверены с installed-справкой; значение стандартизации не выдумывается и формула нормализации не обещается.
Функция ВыполнитьПример() Экспорт
ПроверитьСвойПустойСтенд();
Обучение = СоздатьСвоиТочки(Ложь);
Анализатор = Новый АнализДанных;
Анализатор.ТипАнализа = Тип("АнализДанныхКластеризация");
Анализатор.ИсточникДанных = Обучение;
Настройки = Анализатор.НастройкаКолонок;
Ключ = Настройки.Найти("Код");
X = Настройки.Найти("X");
Y = Настройки.Найти("Y");
Если Ключ = Неопределено Или X = Неопределено Или Y = Неопределено Или Настройки.Количество() <> 3 Тогда
ВызватьИсключение "Нужны три настройки собственных исходных колонок";
КонецЕсли;
Ключ.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Ключ;
Ключ.ВидДанных = ВидДанныхАнализа.Дискретные;
X.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
X.ВидДанных = ВидДанныхАнализа.Непрерывные;
Y.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
Y.ВидДанных = ВидДанныхАнализа.Непрерывные;
УстановитьСвойВес(X.ДополнительныеПараметры, 2);
УстановитьСвойВес(Y.ДополнительныеПараметры, 1);
НастроитьСвойПараметр(Анализатор.Параметры, "КоличествоКластеров", 2);
НастроитьСвойПараметр(Анализатор.Параметры, "МетодКластеризации", МетодКластеризации.ДальняяСвязь);
НастроитьСвойПараметр(Анализатор.Параметры, "ТипЗаполненияТаблицы", ТипЗаполненияТаблицыРезультатаАнализаДанных.ВсеПоля);
Результат = Анализатор.Выполнить();
Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхКластеризация") Или Результат.КоличествоОбъектов <> 6 Тогда
ВызватьИсключение "Нужен настоящий расчет собственных шести точек";
КонецЕсли;
Модель = Результат.СоздатьМодельПрогноза();
Если ТипЗнч(Модель) <> Тип("МодельПрогнозаКластеризация") Или Модель.Кластеры.Количество() <> 2 Тогда
ВызватьИсключение "Не создана собственная модель с двумя кластерами";
КонецЕсли;
НовыеТочки = СоздатьСвоиТочки(Истина);
Модель.ИсточникДанных = НовыеТочки;
Если ТипЗнч(Модель.ИсточникДанных) <> Тип("ТаблицаЗначений") Или Модель.ИсточникДанных.Количество() <> 2 Тогда
ВызватьИсключение "Нужна отдельная собственная таблица двух новых точек";
КонецЕсли;
Колонки = Модель.Колонки;
Входы = Модель.НастройкаВходныхКолонок;
Если ТипЗнч(Колонки) <> Тип("КолонкиМоделиПрогноза") Или ТипЗнч(Входы) <> Тип("НастройкаВходныхКолонокМоделиПрогноза") Или Входы.Количество() <> 2 Тогда
ВызватьИсключение "Нужны настоящие два соответствия X и Y";
КонецЕсли;
СвязатьСвоюВходнуюКолонку(Входы, Колонки, "X");
СвязатьСвоюВходнуюКолонку(Входы, Колонки, "Y");
ИсточникКода = НайтиСвоюКолонку(Колонки, "Код", ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
ИсточникX = НайтиСвоюКолонку(Колонки, "X", ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
ИсточникY = НайтиСвоюКолонку(Колонки, "Y", ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
Кластер = НайтиСвоюКолонку(Колонки, "Кластер", ТипКолонкиМоделиПрогноза.Прогнозируемая);
Выход = Модель.КолонкиРезультата;
Выход.Очистить();
НастройкаКода = Выход.Добавить(ИсточникКода);
НастройкаКода.Имя = "УчебныйКод";
НастройкаX = Выход.Добавить(ИсточникX);
НастройкаX.Имя = "УчебныйX";
НастройкаY = Выход.Добавить(ИсточникY);
НастройкаY.Имя = "УчебныйY";
НастройкаКластера = Выход.Добавить(Кластер);
НастройкаКластера.Имя = "УчебныйКластер";
Отчет = "СВОИ КЛАСТЕРЫ, НЕ СЕГМЕНТАЦИЯ РЕАЛЬНЫХ КЛИЕНТОВ" + Символы.ПС;
Отчет = Отчет + ОписатьСвоиДополнительныеПараметры(Результат.НастройкаКолонок.Найти("X"), 2)
+ ОписатьСвоиДополнительныеПараметры(Результат.НастройкаКолонок.Найти("Y"), 1);
Отчет = Отчет + ОписатьСвоиКолонки(Колонки);
Прогноз = Модель.Выполнить();
Если ТипЗнч(Прогноз) <> Тип("ТаблицаЗначений") Или Прогноз.Количество() <> 2 Или Прогноз.Колонки.Количество() <> 4 Тогда
ВызватьИсключение "Нужна действительная таблица по двум новым точкам и четырем своим колонкам";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("УчебныйКод,УчебныйX,УчебныйY,УчебныйКластер", ",") Цикл
Если Прогноз.Колонки.Найти(Имя) = Неопределено Тогда
ВызватьИсключение "Нет собственной выходной колонки " + Имя;
КонецЕсли;
КонецЦикла;
ВиденныеКоды = Новый Соответствие;
Для Каждого СтрокаПрогноза Из Прогноз Цикл
Код = СтрокаПрогноза.УчебныйКод;
Источник = НовыеТочки.Найти(Код, "Код");
Если Источник = Неопределено Или ВиденныеКоды.Получить(Код) <> Неопределено Тогда
ВызватьИсключение "Чужой или повторный собственный ключ прогноза";
КонецЕсли;
Если СтрокаПрогноза.УчебныйX <> Источник.X Или СтрокаПрогноза.УчебныйY <> Источник.Y Или ТипЗнч(СтрокаПрогноза.УчебныйКластер) <> Тип("Число") Тогда
ВызватьИсключение "Не сохранены входные координаты или не получен числовой номер кластера";
КонецЕсли;
ВиденныеКоды.Вставить(Код, Истина);
Отчет = Отчет + Код + "; X=" + Строка(Источник.X) + "; Y=" + Строка(Источник.Y)
+ "; ближайший кластер как вернула платформа=" + Строка(СтрокаПрогноза.УчебныйКластер) + Символы.ПС;
КонецЦикла;
Если ВиденныеКоды.Количество() <> 2 Или Обучение.Количество() <> 6 Или НовыеТочки.Количество() <> 2 Тогда
ВызватьИсключение "Не совпали собственные размеры и ключи независимых таблиц";
КонецЕсли;
Возврат Отчет + "Номера кластеров не являются постоянными бизнес-кодами; качество на двух точках не доказано";
КонецФункции
Функция СоздатьСвоиТочки(ДляПрогноза)
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("X", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Y", Новый ОписаниеТипов("Число"));
Координаты = Новый Массив;
Если ДляПрогноза Тогда
Координаты.Добавить(Новый Структура("X,Y", 0.5, 0.5));
Координаты.Добавить(Новый Структура("X,Y", 10.5, 10.5));
Префикс = "own-new-point-";
Ожидается = 2;
Иначе
Координаты.Добавить(Новый Структура("X,Y", 0, 0));
Координаты.Добавить(Новый Структура("X,Y", 0, 1));
Координаты.Добавить(Новый Структура("X,Y", 1, 0));
Координаты.Добавить(Новый Структура("X,Y", 10, 10));
Координаты.Добавить(Новый Структура("X,Y", 10, 11));
Координаты.Добавить(Новый Структура("X,Y", 11, 10));
Префикс = "own-training-point-";
Ожидается = 6;
КонецЕсли;
Номер = 0;
Для Каждого Координата Из Координаты Цикл
Номер = Номер + 1;
Точка = Таблица.Добавить();
Точка.Код = Префикс + Строка(Номер);
Точка.X = Координата.X;
Точка.Y = Координата.Y;
КонецЦикла;
Если Таблица.Количество() <> Ожидается Тогда
ВызватьИсключение "Нарушен размер собственной таблицы точек";
КонецЕсли;
Возврат Таблица;
КонецФункции
Процедура УстановитьСвойВес(Параметры, Вес)
Если ТипЗнч(Параметры) <> Тип("ПараметрыКолонкиКластерногоАнализа") Или ТипЗнч(Вес) <> Тип("Число") Или Вес <= 0 Тогда
ВызватьИсключение "Нужны настоящие дополнительные параметры и положительный свой вес";
КонецЕсли;
Параметры.Вес = Вес;
Если Параметры.Вес <> Вес Тогда
ВызватьИсключение "Свой вес колонки не сохранился";
КонецЕсли;
КонецПроцедуры
Функция ОписатьСвоиДополнительныеПараметры(Колонка, ОжидаемыйВес)
Если Колонка = Неопределено Тогда
ВызватьИсключение "Исчезла собственная колонка результата";
КонецЕсли;
Параметры = Колонка.ДополнительныеПараметры;
Если ТипЗнч(Параметры) <> Тип("ПараметрыКолонкиКластерногоАнализа") Или Параметры.Вес <> ОжидаемыйВес Тогда
ВызватьИсключение "Результат не сохранил настоящие свои дополнительные параметры";
КонецЕсли;
Нормализация = Параметры.ЗначенияНормализации;
Если ТипЗнч(Нормализация) <> Тип("Соответствие") Или Нормализация.Количество() > 64 Тогда
ВызватьИсключение "Нужна небольшая настоящая карта нормализации собственной колонки";
КонецЕсли;
Отчет = Колонка.Имя + "; вес=" + Строка(Параметры.Вес) + "; записей нормализации=" + Строка(Нормализация.Количество()) + Символы.ПС;
Для Каждого Пара Из Нормализация Цикл
Отчет = Отчет + "ключ=" + Строка(Пара.Ключ) + "; тип ключа=" + Строка(ТипЗнч(Пара.Ключ))
+ "; значение=" + Строка(Пара.Значение) + "; тип значения=" + Строка(ТипЗнч(Пара.Значение)) + Символы.ПС;
КонецЦикла;
Возврат Отчет;
КонецФункции
Функция НайтиСвойПараметр(Параметры, Имя)
Параметр = Параметры.Найти(Имя);
Если Параметр = Неопределено Или ТипЗнч(Параметр) <> Тип("ПараметрАнализаДанных") Тогда
ВызватьИсключение "Не найден собственный параметр алгоритма " + Имя;
КонецЕсли;
Индекс = Параметры.Индекс(Параметр);
Если Индекс < 0 Или Индекс >= Параметры.Количество() Тогда
ВызватьИсключение "Индекс настоящего параметра выходит за границы";
КонецЕсли;
ПоИндексу = Параметры.Получить(Индекс);
Если ПоИндексу.Имя <> Параметр.Имя Или ПоИндексу.Имя <> Имя Тогда
ВызватьИсключение "Найти и Получить не вернули один собственный параметр";
КонецЕсли;
Возврат Параметр;
КонецФункции
Процедура НастроитьСвойПараметр(Параметры, Имя, Значение)
Параметр = НайтиСвойПараметр(Параметры, Имя);
Если Не Параметр.ТипЗначения.СодержитТип(ТипЗнч(Значение)) Тогда
ВызватьИсключение "Тип значения не разрешен реальным параметром " + Имя;
КонецЕсли;
Параметр.Значение = Значение;
ПроверитьСвойПараметр(Параметры, Имя, Значение);
КонецПроцедуры
Процедура ПроверитьСвойПараметр(Параметры, Имя, Эталон)
Параметр = НайтиСвойПараметр(Параметры, Имя);
Если ТипЗнч(Параметр.Значение) <> ТипЗнч(Эталон) Или Параметр.Значение <> Эталон Тогда
ВызватьИсключение "Не совпал собственный параметр результата " + Имя;
КонецЕсли;
КонецПроцедуры
Функция НайтиСвоюКолонку(Колонки, Имя, Вид)
Колонка = Колонки.Найти(Имя, Вид);
Если Колонка = Неопределено Или ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
ВызватьИсключение "Нет настоящей колонки модели: " + Имя + "; вид=" + Строка(Вид);
КонецЕсли;
Если Колонка.Имя <> Имя Или Колонка.ТипКолонки <> Вид Тогда
ВызватьИсключение "Найдена колонка с другим именем или ролью";
КонецЕсли;
Индекс = Колонки.Индекс(Колонка);
Если Индекс < 0 Или Индекс >= Колонки.Количество() Тогда
ВызватьИсключение "Индекс найденной колонки вне реальной коллекции";
КонецЕсли;
ПоИндексу = Колонки.Получить(Индекс);
Если ПоИндексу.Имя <> Имя Тогда
ВызватьИсключение "По индексу получено другое имя колонки";
КонецЕсли;
Возврат Колонка;
КонецФункции
Функция ОписатьСвоиКолонки(Колонки)
Стек = Новый Массив;
Для Каждого Колонка Из Колонки Цикл
Стек.Добавить(Новый Структура("Колонка,Уровень", Колонка, 0));
КонецЦикла;
Обработано = 0;
Отчет = "ДЕЙСТВИТЕЛЬНАЯ ИЕРАРХИЯ КОЛОНОК" + Символы.ПС;
Пока Стек.Количество() > 0 Цикл
Индекс = Стек.Количество() - 1;
Кадр = Стек[Индекс];
Стек.Удалить(Индекс);
Если Кадр.Уровень > 16 Или Обработано >= 128 Тогда
ВызватьИсключение "Своя диагностика превысила учебный предел 128 колонок или 16 уровней";
КонецЕсли;
Колонка = Кадр.Колонка;
Если ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
ВызватьИсключение "В иерархии нет настоящего описания колонки";
КонецЕсли;
Обработано = Обработано + 1;
Отчет = Отчет + "Уровень=" + Строка(Кадр.Уровень) + "; имя=" + Колонка.Имя
+ "; путь=" + Колонка.ПутьКДанным + "; роль=" + Строка(Колонка.ТипКолонки)
+ "; тип дополнительных параметров=" + Строка(ТипЗнч(Колонка.ДополнительныеПараметры)) + Символы.ПС;
Дети = Колонка.Колонки;
Если ТипЗнч(Дети) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Вложенные описания должны быть настоящим фиксированным массивом";
КонецЕсли;
Для Каждого Дочерняя Из Дети Цикл
Стек.Добавить(Новый Структура("Колонка,Уровень", Дочерняя, Кадр.Уровень + 1));
КонецЦикла;
КонецЦикла;
Возврат Отчет;
КонецФункции
Процедура СвязатьСвоюВходнуюКолонку(Настройки, Колонки, Имя)
Настройка = Настройки.Найти(Имя);
Если Настройка = Неопределено Или ТипЗнч(Настройка) <> Тип("НастройкаВходнойКолонкиМоделиПрогноза") Тогда
ВызватьИсключение "Не найдена настоящая настройка собственного входа " + Имя;
КонецЕсли;
Вход = НайтиСвоюКолонку(Колонки, Имя, ТипКолонкиМоделиПрогноза.Входная);
Источник = НайтиСвоюКолонку(Колонки, Имя, ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
Настройка.КолонкаМоделиПрогноза = Вход;
Настройка.КолонкаИсточникаДанных = Источник;
Если Настройка.КолонкаМоделиПрогноза.Имя <> Имя Или Настройка.КолонкаИсточникаДанных.Имя <> Имя Тогда
ВызватьИсключение "Свое соответствие не сохранилось " + Имя;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедурыУчебныйНовыйКластер85.Обработка.Форма
Собственная внешняя обработка → управляемая Форма → Модуль
Полный клиент-серверный модуль своей формы; клиент получает только текст серверного расчета.
&НаКлиенте
Процедура Выполнить(Команда)
Отчет = ВыполнитьНаСервере();
Сообщить(Отчет);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
Возврат УчебныйНовыйКластер85.ВыполнитьПример();
КонецФункцииРазбор по шагам
Защита стенда выполняется до расчетов. Настройки трех исходных колонок получают у реального АнализДанных, назначают ключ/входы и реальные виды данных. ДополнительныеПараметры X/Y проверяются как ПараметрыКолонкиКластерногоАнализа до записи Вес.
УстановитьСвойВес принимает только положительное числовое значение; запись Вес перечитывается. Вес влияет на анализ входной колонки, но урок не утверждает неподтвержденную конкретную формулу расстояния или порядок номеров кластеров.
Каждый параметр алгоритма ищется в настоящей коллекции, его индекс и разрешенный тип проверяются, значение задается и перечитывается. Выполнить возвращает реальный кластерный результат по шести обучающим объектам; модель создается из этого результата.
У параметров колонок результата читаются фактические Вес и ЗначенияНормализации. Последнее — readonly-свойство типа Соответствие: ничего в нем не записываем. Для каждого реального ключа/значения выводятся значение и тип; пустая карта допустима и не заменяется вымышленной формулой.
Модель.ИсточникДанных получает отдельную таблицу двух новых точек. НастройкаВходныхКолонок должна содержать два реальных соответствия. X/Y связываются через объекты КолонкаМоделиПрогноза правильных ролей Входная/КолонкаИсточникаДанных, не через колонки таблицы.
Кластер ищется как настоящая Прогнозируемая колонка, описанная в native-модели. Выходная схема явно содержит собственные имена УчебныйКод, УчебныйX, УчебныйY, УчебныйКластер. Код показывает фактическую иерархию колонок, пути и типы дополнительных параметров без придуманного вложенного пути.
Модель.Выполнить находится после настройки и возвращает реальную ТаблицаЗначений. Проверяются две строки, четыре имени, уникальные свои коды, сохранение X/Y и числовой тип кластера. Исходная строка ищется по коду, не по предполагаемому порядку результата.
Номер кластера выводится как вернула платформа. Не предполагаем нумерацию с нуля/единицы, конкретные 0/1 или устойчивость между другими расчетами. Обе таблицы памяти остаются независимыми, размеры 6/2 проверяются.
Как проверить результат
Будущий положительный опыт: отчет показывает свои веса 2/1, фактическую карту нормализации X/Y, реальную иерархию и по одному кластерному результату для двух новых кодов. Входные координаты в выводе должны совпасть с 0.5/0.5 и 10.5/10.5.
Будущий отрицательный контроль веса: только значение первого вызова УстановитьСвойВес заменить с 2 на 0. Проверка положительного веса должна остановиться до анализа. Затем вернуть 2.
Будущий отрицательный контроль входа: только вызов СвязатьСвоюВходнуюКолонку для Y заменить именем ЧужаяКоордината. Проверка наличия настоящей настройки должна остановиться до прогноза. Вернуть Y.
Будущий отрицательный контроль результата: сразу после Прогноз = Модель.Выполнить() временно присвоить Прогноз = Неопределено. Проверка типа должна остановиться до чтения строк; затем вернуть исходный код.
runtimeVerifiedScenarios=0: 1С, BSL, алгоритм, модель, форма и база здесь не запускались. Статические проверки не доказывают фактическое распределение новых точек или формулу нормализации. Все ручные опыты — только будущие, на собственном отдельном стенде.
Ожидаемый результат
Есть реальный самостоятельный конвейер обучения, дополнительных параметров и прогноза; карта нормализации и ближайшие кластеры берутся из настоящих результатов, не из заранее написанных ответов.
На что обратить внимание
ЗначенияНормализации не присваиваются, полученное Соответствие не меняется. Для непрерывной колонки карта может быть пустой; это не разрешение придумать преобразование значений.
Номера кластеров не служат постоянными кодами бизнес-сегментов. Две вымышленные новые точки не доказывают качество сегментации реальных клиентов.
Колонки/КолонкиРезультата/НастройкаВходныхКолонок модели — readonly-свойства; редактируются только разрешенные реальные элементы возвращенных настроек.
У КолонкиМоделиПрогноза.Получить в installed-справке противоречивый возвращаемый тип. Общий помощник проверяет только доступное Имя его результата и использует настоящий объект Найти для остальных свойств, не утверждая runtime-исправление документации.
Нет записи базовых данных, файлов, запросов к рабочей конфигурации, сети или GUI расчета. На клиент приходит только текст.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Сгруппировать шесть точек и создать модель без выдуманного прогноза
Две очевидно разделённые группы числовых точек позволяют понять роли ключа, входных колонок, параметров и результата кластеризации.
Где и как запускать
Полный модуль управляемой формы собственной внешней обработки, только толстый клиент Windows.
Подготовка
Собственная учебная база 8.5.1.1343, толстый клиент Windows. Создайте внешнюю обработку с управляемой формой, командой Выполнить и её кнопкой. Вставьте весь модуль выбранного урока.
Методы построителя отчёта доступны только толстому клиенту, хотя сам тип упомянут и в других контекстах. Не переносите этот полный модуль в тонкий/веб-клиент или серверный обработчик.
Для отдельного урока АнализДанных без построителя используется собственный серверный общий модуль УчебнаяСтатистика с флагом Сервер и вызов УчебнаяСтатистика.ВыполнитьПример() из серверной команды.
Все значения вымышлены и создаются в памяти. Нет чтения документов/платежей, сетевых моделей, персональных данных, записи базы, сохранения файлов или печати.
Это учебный расчёт на маленьком наборе. Он не даёт основания прогнозировать реальные продажи или принимать бизнес-решения без проверки качества исходных данных.
&НаКлиенте
Процедура Выполнить(Команда)
Точки = Новый ТаблицаЗначений;
Точки.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
Точки.Колонки.Добавить("X", Новый ОписаниеТипов("Число"));
Точки.Колонки.Добавить("Y", Новый ОписаниеТипов("Число"));
Координаты = Новый Массив;
Координаты.Добавить(Новый Структура("X,Y", 0, 0));
Координаты.Добавить(Новый Структура("X,Y", 0, 1));
Координаты.Добавить(Новый Структура("X,Y", 1, 0));
Координаты.Добавить(Новый Структура("X,Y", 10, 10));
Координаты.Добавить(Новый Структура("X,Y", 10, 11));
Координаты.Добавить(Новый Структура("X,Y", 11, 10));
Для Индекс = 0 По 5 Цикл
Точка = Точки.Добавить();
Точка.Код = "guide-point-" + Строка(Индекс + 1);
Точка.X = Координаты[Индекс].X;
Точка.Y = Координаты[Индекс].Y;
КонецЦикла;
Построитель = Новый ПостроительОтчетаАнализаДанных;
Построитель.ТипАнализа = Тип("АнализДанныхКластеризация");
Построитель.ИсточникДанных = Точки;
Построитель.ОтображатьСостояние = Ложь;
Построитель.ОбрабатыватьПрерываниеПользователя = Истина;
Колонки = Построитель.НастройкаКолонок;
Ключ = Колонки.Найти("Код");
X = Колонки.Найти("X");
Y = Колонки.Найти("Y");
Если Ключ = Неопределено ИЛИ X = Неопределено ИЛИ Y = Неопределено Тогда
ВызватьИсключение "Нет трёх настроек собственных колонок";
КонецЕсли;
Ключ.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Ключ;
Ключ.ВидДанных = ВидДанныхАнализа.Дискретные;
X.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
X.ВидДанных = ВидДанныхАнализа.Непрерывные;
Y.ТипКолонки = ТипКолонкиАнализаДанныхКластеризация.Входная;
Y.ВидДанных = ВидДанныхАнализа.Непрерывные;
Количество = ПараметрУчебногоАнализа(Построитель.Параметры, "КоличествоКластеров", "ClusterCount");
Если НЕ Количество.ТипЗначения.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "У параметра количества ожидается числовой тип";
КонецЕсли;
Количество.Значение = 2;
Метод = ПараметрУчебногоАнализа(Построитель.Параметры, "МетодКластеризации", "ClusterizationMethod");
Метод.Значение = МетодКластеризации.ДальняяСвязь;
Заполнение = ПараметрУчебногоАнализа(Построитель.Параметры, "ТипЗаполненияТаблицы", "TableFillType");
Заполнение.Значение = ТипЗаполненияТаблицыРезультатаАнализаДанных.ВсеПоля;
Сообщить("Параметр: " + Количество.Имя + "; заголовок: " + Количество.Заголовок);
Сообщить(Количество.Значение = 2);
Сообщить(Ключ.Имя = "Код");
Сообщить("Тип дополнительных параметров X: " + Строка(ТипЗнч(X.ДополнительныеПараметры)));
Сообщить(Колонки.Количество() = 3);
Сообщить(Колонки.Получить(Колонки.Индекс(Ключ)) = Ключ);
Построитель.Выполнить();
Результат = Построитель.Результат;
Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхКластеризация") Тогда
ВызватьИсключение "Ожидался результат кластеризации";
КонецЕсли;
Сообщить(Результат.КоличествоОбъектов = 6);
Сообщить(Результат.Кластеры.Количество() = 2);
Сообщить(Результат.ОбъектыКластеризации.Количество() = 6);
Сообщить(Результат.ТаблицаКластеризации.Количество() = 6);
ВсегоВКластерах = 0;
Для Каждого Кластер Из Результат.Кластеры Цикл
ВсегоВКластерах = ВсегоВКластерах + Кластер.КоличествоОбъектов;
Сообщить(СтрШаблон("Размер группы=%1; координат центра=%2", Кластер.КоличествоОбъектов, Кластер.ЦентрТяжести.Количество()));
Сообщить("Тип значений прогноза: " + Строка(ТипЗнч(Кластер.ЗначенияПолейПрогноза)));
КонецЦикла;
Сообщить(ВсегоВКластерах = 6);
Сообщить("Строк таблицы связей: " + Строка(Результат.ТаблицаСвязей.Количество()));
Сообщить("Строк матрицы расстояний: " + Строка(Результат.МежкластерныеРасстояния.Количество()));
Сообщить(ТипЗнч(Результат.НастройкаКолонок) = Тип("КолонкиАнализаДанных"));
Сообщить(ТипЗнч(Результат.Параметры) = Тип("ПараметрыАнализаДанных"));
Модель = Результат.СоздатьМодельПрогноза();
Построитель.МодельПрогноза = Модель;
Сообщить(ТипЗнч(Построитель.МодельПрогноза) = Тип("МодельПрогнозаКластеризация"));
Сообщить(Модель.Кластеры.Количество() = 2);
Сообщить("Входных колонок модели: " + Строка(Модель.Колонки.Количество()));
Сообщить("Выходных колонок модели: " + Строка(Модель.КолонкиРезультата.Количество()));
Сообщить("Соответствий входа модели: " + Строка(Модель.НастройкаВходныхКолонок.Количество()));
Сообщить("Модель создана, но прогноз новых объектов не выполнялся");
Документ = Новый ТабличныйДокумент;
Построитель.Вывести(Документ);
Документ.Показать("Учебные две группы шести вымышленных точек");
КонецПроцедуры
&НаКлиенте
Функция ПараметрУчебногоАнализа(Параметры, Русское, Английское)
Параметр = Параметры.Найти(Русское);
Если Параметр = Неопределено Тогда
Параметр = Параметры.Найти(Английское);
КонецЕсли;
Если Параметр = Неопределено Тогда
ВызватьИсключение "Нет документированного параметра " + Русское;
КонецЕсли;
Возврат Параметр;
КонецФункцииРазбор по шагам
Шесть точек созданы в памяти: три около (0,0), три около (10,10). Код — ключ, X/Y — непрерывные входные поля. Нет географических координат, пользователей или реальной выручки.
Параметры ищутся по документированному русскому/английскому имени. КоличествоКластеров получает 2 после проверки ТипЗначения, МетодКластеризации — ДальняяСвязь.
ТипЗаполненияТаблицы=ВсеПоля нужен для собственного отчёта по шести строкам. Наличие результата не угадывается до выполнения.
Читаем размеры кластеров, центры, таблицу кластеризации, идентификаторы объектов и диагностические таблицу связей/матрицу расстояний. Номера групп не объявляются устойчивыми бизнес-идентификаторами.
СоздатьМодельПрогноза даёт реальный объект модели; его присваиваем МодельПрогноза собственного построителя. Это не вызов Модель.Выполнить и не готовый прогноз новых данных.
Без прогнозируемых колонок ЗначенияПолейПрогноза не выдаются за прибыль/вероятности продажи. Модель здесь только создана и описана.
Отчёт Вывести строится в собственном ТабличныйДокумент и показывается толстому клиенту. Никакая печать или выгрузка в файл не выполняется.
Как проверить результат
Тринадцать логических проверок ожидаются Истина: параметры/колонки, шесть объектов, две группы, сохранение общего количества, типы описаний и модели.
Размеры групп и центры выводятся как фактические диагностические значения; не требуйте заранее назначенного номера первой/второй группы.
Последнее сообщение прямо говорит: новый прогноз не выполнялся.
Ожидаемый результат
Есть полный пример реального кластерного расчёта на шести точках, отчёт и созданная модель с честной границей прогноза.
На что обратить внимание
Модель не становится качественной для реального бизнеса от одного успешного создания.
Не сравнивать номера кластеров между разными входами как постоянные коды клиентов.
Метод, масштаб признаков и стандартизация влияют на результат; этот маленький опыт не подменяет выбор модели на проверочной выборке.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.