Комбинаторный рост класса полиномиальных признаков в склеарне - PullRequest
0 голосов
/ 19 февраля 2020

Я работаю над книгой Джерона "Руки по машинному обучению ...".

В главе 4 обсуждается класс PolynomialFeatures, и утверждается, что: "PolynomialFeatures (степень = d) преобразует массив, содержащий n объектов в массив, содержащий (n + d)! / d! n! объектов, где n! - факториал числа n, равный 1 × 2 × 3 × ⋯ × n. Остерегайтесь комбинаторного взрыва числа функций! "

Легко понять, почему произошел комбинаторный взрыв, но мне было любопытно, как появился точный счет (n + d)! / (d! n!) функций.

Я хочу дать свое объяснение и посмотреть, согласны ли другие с моей логикой c.

Во всем объяснении я использую пример нахождения всех комбинаций двух терминов a и b.

Объяснение:

Первая реализация состоит в том, что у нас здесь, по существу, есть проблема звезд и стержней (https://en.wikipedia.org/wiki/Stars_and_bars_ (комбинаторика) ).

Но проблема не в том, просто, как спросить, как человек y комбинации a и b присутствуют, например, в разложении (a + b) ^ k, поскольку нам также нужны все члены более низкого порядка. Например, (a + b) ^ 3 даст нам комбинации a ^ 3, a ^ 2b, ab ^ 2 и b ^ 3. Но класс PolynomialFeatures будет также включать ^ 2, ab, b ^ 2, a, b и 1 (1 - это термин смещения, возвращаемый функцией).

Итак, я буду использовать свой игрушечный пример два термина a и b и желание найти количество терминов, возвращаемых PolyFeatures (степень = 3).

В коде я объясню, почему ниже выводится 10:

a = 5
b = 6
X = [[a,b]]
poly_feat = PolynomialFeatures(degree=3)
print(len(poly_feat.fit_transform(X)[0]))

Мы в основном можно подумать о выборе того, как мы хотим распределить наши 3 степени (то есть a ^ 3, b ^ 2a, et c.), но мы также должны учитывать тот факт, что сумма всех степеней может варьироваться от 3 до 0 (член смещения, имеющий 0 степеней, распределенных по 0 переменным).

Итак, если мы предположим, что у нас есть набор {a, b} двух наших терминов, мы можем просто добавить еще один «фиктивный» термин, называемый none. Таким образом, наш набор {a, b, none}. В нашем примере выше у нас есть полномочия степени 3 или, по сути, 3, которые мы можем назначить (мы будем рассматривать способности как звезды в методе звезд и столбцов).

Способности (звезды):

***

И в соответствии со звездами и столбцами мы хотим распределить наши полномочия по 3 терминам (a, b, none), поэтому у нас есть 3 - 1 = 2 бара.

Условия ( бары): ||

Итак, примером нескольких из наших десяти комбинаций будет:

| * | ** = b

|| *** = 1

*** || = a ^ 3

** | * | = a ^ 2b

et c.

По сути, мы распределяем полномочия на три ведра: a | б | никто. И когда у нас есть все полномочия, которым не присвоено ни одного, то есть ^ 0b ^ 0, равного всего 1 (или члену смещения).

Итак, это обобщается следующим образом.

Если мы имеем n сроки и хотят степень d. Мы {((n + 1) + d-1) выбирают d} способов сделать эти комбинации (обратите внимание, у нас был один к n, чтобы учесть термин «none», который мы использовали в примере выше, а остальная часть формулы следующая от звезд и баров в вики ссылка выше). Что упрощает {{n + d) выбрать d} или (n + d)! / (D! N!).

Пожалуйста, дайте мне знать, если кто-то видит изъян в этой логике c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...