Я работаю над книгой Джерона "Руки по машинному обучению ...".
В главе 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.