Я использую классификатор 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
Вот результаты: Плотный матрица (как и ожидалось): разреженная матрица (ошибочный):
Что с разреженной матрицей?
Просто интересно, почему вы используете RBF ядро? Кажется, что линейное ядро может работать нормально. Кроме того, вы можете попробовать кластеризацию k-mean, так как она, похоже, удовлетворяет этой проблеме достаточно хорошо. –
Вы правы, но в моем реальном наборе данных линейное ядро не подходит. Цель состоит в том, чтобы найти наиболее похожие объекты для уникального класса, поэтому я использую классификатор 1 класса, я не вижу, как это сделать, используя k-средства. Изображение здесь, чтобы показать разницу между разреженным и плотным, позвольте мне добавить плотное изображение результата в качестве сравнения – Quentin