как превратить матрицу в разреженную матрицу и создать ее - PullRequest
0 голосов
/ 09 июля 2019

У меня есть набор данных с 16 столбцами и 100 000 строк, которые я пытаюсь подготовить для обучения матричной факторизации.Я использую следующий код, чтобы разделить его и превратить в разреженную матрицу.

X=data.drop([data.columns[0]],axis='columns')
y=data[[1]]
X=lil_matrix(100000,15).astype('float32')
y=np.array(y).astype('float32')
X

Но когда я запускаю его, я получаю эту ошибку:

<1x1 разреженныйматрица типа '' с 1 сохраненным элементом в формате LInked List>.

Когда я пытаюсь подключить ее к разделу обучения / тестирования, это дает мне дополнительные ошибки:

Найдены входные переменные с непоследовательным количеством выборок: [1, 100000]

1 Ответ

0 голосов
/ 11 июля 2019

Связанная notebook создает «пустую» разреженную матрицу и устанавливает выбранные элементы из данных, которые она считывает из csv.

Простой пример этого:

In [565]: from scipy import sparse                                                                           
In [566]: M = sparse.lil_matrix((10,5), dtype=float)                                                         
In [567]: M                                                                                                  
Out[567]: 
<10x5 sparse matrix of type '<class 'numpy.float64'>'
    with 0 stored elements in LInked List format>

Обратите внимание, что я использую (10,5), чтобы указать форму матрицы.Причина!Вот почему я подчеркнул, читая docs.В ссылке соответствующая строка:

X = lil_matrix((lines, columns)).astype('float32')

Теперь я могу установить пару элементов, как и плотный массив:

In [568]: M[1,2] = 12.3                                                                                      
In [569]: M[3,1] = 1.1                                                                                       
In [570]: M                                                                                                  
Out[570]: 
<10x5 sparse matrix of type '<class 'numpy.float64'>'
    with 2 stored elements in LInked List format>

Я могу использовать toarray для отображенияматрица в виде плотного массива (не пытайтесь сделать это с большими размерами).

In [571]: M.toarray()                                                                                        
Out[571]: 
array([[ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. , 12.3,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  1.1,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ]])

Если я опускаю (), она создает матрицу (1,1) только с одним элементом,первый номер.

In [572]: sparse.lil_matrix(10,5)                                                                            
Out[572]: 
<1x1 sparse matrix of type '<class 'numpy.int64'>'
    with 1 stored elements in LInked List format>
In [573]: _.A                                                                                                
Out[573]: array([[10]], dtype=int64)

Посмотрите еще раз на свой код.Вы устанавливаете значение X дважды, как только это будет кадр данных.Второй раз это плохая lil инициализация.Второй раз не использует первый X.

X=data.drop([data.columns[0]],axis='columns')
...
X=lil_matrix(100000,15).astype('float32')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...