2015-08-06 2 views
0

Я использую классификатор OneClassSVM с плотной матрицей, результаты довольно хорошие. Я хотел бы включить некоторые тексты в своих функциях и использовать разреженную матрицу, однако я действительно Дифференц (и неправильно) результат при использовании разреженной матрицы, я не понимаю, почемуscikit OneClassSvm разреженная матрица возвращает (очень) другой результат, чем плотный

Вот пример:

import io 
from pandas import pandas 
import scipy 
from sklearn import svm 

t="""A,B,C,D,E,F 
    11,1,2,3,4,5 
    11,1,2,0,3,6 
    11,1,2,3,2,5 
    11,2,0,3,1,7 
    11,4,2,3,0,5""" 
t_test="""A,B,C,D,E,F 
      12,1,3,0,1,5 
      14,2,2,3,2,8 
      12,1,2,3,4,5 
      18,2,3,1,3,2""" 
df = pandas.read_csv(io.StringIO(t), dtype=float) 
df_test = pandas.read_csv(io.StringIO(t_test), dtype=float) 

cl = svm.OneClassSVM(nu=0.1, kernel='rbf', gamma=0.16) 
cl.fit(df) 
print(cl.decision_function(df_test)) 

cl = svm.OneClassSVM(nu=0.1, kernel='rbf', gamma=0.16) 
cl.fit(scipy.sparse.csr_matrix(df.values)) 
print(cl.decision_function(scipy.sparse.csr_matrix(df_test))) 

результат:

#Dense 
[[-0.094537 ] 
[-0.13060355] 
[-0.02208006] 
[-0.14990236]] 
#sparse 
[[ -4.67612004e-311] 
[ -6.79156324e-311] 
[ -5.92318332e-311] 
[ -6.94061414e-311]] 

Я также попытался scikit OneClassSVM пример с разреженной матрицей и результат очень плохо: https://gist.github.com/Avricot/68775656ab77217e5569

Вот результаты: Плотный матрица (как и ожидалось): enter image description here разреженная матрица (ошибочный): enter image description here

Что с разреженной матрицей?

+0

Просто интересно, почему вы используете RBF ядро? Кажется, что линейное ядро ​​может работать нормально. Кроме того, вы можете попробовать кластеризацию k-mean, так как она, похоже, удовлетворяет этой проблеме достаточно хорошо. –

+0

Вы правы, но в моем реальном наборе данных линейное ядро ​​не подходит. Цель состоит в том, чтобы найти наиболее похожие объекты для уникального класса, поэтому я использую классификатор 1 класса, я не вижу, как это сделать, используя k-средства. Изображение здесь, чтобы показать разницу между разреженным и плотным, позвольте мне добавить плотное изображение результата в качестве сравнения – Quentin

ответ

2

Это ошибка https://github.com/scikit-learn/scikit-learn/issues/5095 Это было исправлено по запросу 5093 pull. Если вы хотите - вы можете подождать, пока кто-нибудь не сливать его в мастера, или использовать его сейчас:

git clone https://github.com/scikit-learn/scikit-learn.git 
cd scikit-learn/ 
git fetch origin refs/pull/5093/head:pn_5093 
git checkout pn_5093 
python3 setup.py install --user