ValueError: Ожидаемый двумерный массив, вместо этого получен скалярный массив:
array=None.
Изменить форму ваши данные либо используют array.reshape(-1, 1), если ваши данные содержат один объект, либо > array.reshape(1, -1), если они содержат один образец.
В сообщении об ошибке указано, что массив имеет значение None, тогда как массив, передаваемый в метод fit_transform(), имеет размер (8, 2).< /p>
Обратите внимание, что в sklearn массив W содержит состав компонентов каждого экземпляра (строки данных) в виде матрицы строк данных по компонентам. (Терминология sklearn для матриц W и H противоположна общепринятому использованию и потенциально может сбивать с толку.)
Массив W, возвращаемый NMF.fit_transform() не показывает состав экземпляра как долю каждого компонента в экземпляре. Однако это желаемый (и наиболее значимый) результат. Но метод fit_transform() позволяет получить начальное предположение для матрицы W. Итак, процесс, описанный здесь (в примере кода), заключается в следующем: 1) Запустить NMF, чтобы получить начальную оценку W; 2) Сумма строк стандартизирует матрицу W; и 3) повторно запустить NMF, указав использование стандартизированной версии W для суммы строк, чтобы получить соответствующую матрицу H.
Этот процесс показан в примере ниже. Набор входных данных D был построен таким образом, что он имеет точное решение с двумя компонентами. Первоначальная версия W, стандартизованная по сумме строк (
Код: Выделить всё
W1
Код: Выделить всё
import numpy as np
from sklearn.decomposition import NMF
D = np.array([[435.1 , 287.1 , 501.9 , 804.1 , 541.5 ],
[200.6 , 382.6 , 261.4 , 509.6 , 494. ],
[130.25, 411.25, 189.25, 421.25, 479.75],
[341.3 , 325.3 , 405.7 , 686.3 , 522.5 ],
[ 36.45, 449.45, 93.05, 303.45, 460.75],
[411.65, 296.65, 477.85, 774.65, 536.75],
[317.85, 334.85, 381.65, 656.85, 517.75],
[270.95, 353.95, 333.55, 597.95, 508.25]])
nmf_model = NMF(n_components=2)
W = nmf_model.fit_transform(D)
# Set W1 by row-sum standardizing W.
W1 = W / np.sum(W, axis=1)[:, np.newaxis]
# Re-do matrix factorization with W fixed at W1.
nmf_model = NMF(n_components=2, init='custom')
W2 = nmf_model.fit_transform(D, W=W1)
Среда: версия Python: 3.10.12; версия sklearn: 1.5.1.
** РЕДАКТИРОВАНИЕ: РЕШЕНО
Я оставлю это на случай, если это будет полезно кому-то еще.
Решение состоит в том, что при init='custom' первоначальные оценки должны быть предоставлены как для W, так и для H-матриц. Матрица H, соответствующая стандартизированной матрице W по сумме строк, может быть получена путем умножения строк матрицы H на отношение сумм столбцов матрицы W до и после стандартизации суммы строк.
Когда предоставлены оценки для матриц W и H, еще один запуск процесса NMF даст лучшую матрицу, но все же не обязательно такую, в которой суммы строк W равны 1,0. Если процесс повторяется, результат сходится к W-матрице с желаемым свойством. Для используемого здесь примера набора данных порог MSE 0,00001 для сумм строк W был достигнут за 16 итераций.
Подробнее здесь: https://stackoverflow.com/questions/787 ... -fit-trans