# This file is part of Sympathy for Data.
# Copyright (c) 2017, Combine Control Systems AB
#
# SYMPATHY FOR DATA COMMERCIAL LICENSE
# You should have received a link to the License with Sympathy for Data.
"""
Some of the docstrings for this module have been automatically
extracted from the `scikit-learn <http://scikit-learn.org/>`_ library
and are covered by their respective licenses.
"""
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as Lda
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis as Qda
from sympathy.api import node
from sympathy.api.nodeconfig import Ports, Tag, Tags
from sylib.machinelearning.model import ModelPort
from sylib.machinelearning.abstract_nodes import SyML_abstract
from sylib.machinelearning.utility import names_from_x, names_from_y
from sylib.machinelearning.descriptors import BoolType
from sylib.machinelearning.descriptors import FloatType
from sylib.machinelearning.descriptors import IntType
from sylib.machinelearning.descriptors import NoneType
from sylib.machinelearning.descriptors import StringSelectionType
from sylib.machinelearning.descriptors import UnionType
from sylib_aml.discriminant_analysis import DiscriminantAnalysisDescriptor
[docs]
class LinearDiscriminantAnalysis(SyML_abstract, node.Node):
name = 'Linear Discriminant Analysis'
author = 'Mathias Broxvall'
icon = 'LDA.svg'
description = (
'Constructs linear combinations of features that separates two or '
'more classes. Can used either as a linear classifier or, more '
'commonly, as a dimensionality reduction technique. For '
'dimensionality reduction it requires a Y input to the '
'fit_transform node'
)
nodeid = 'com.sympathyfordata.advancedmachinelearning' \
'.linear_discriminant_analysis'
tags = Tags(Tag.MachineLearning.DimensionalityReduction)
descriptor = DiscriminantAnalysisDescriptor()
descriptor.name = name
info = [
{'name': 'solver',
'dispname': 'Solver to use',
'type': StringSelectionType(['svd', 'lsqr', 'eigen'])},
{'name': 'shrinkage',
'dispname': 'Shrinkage parameter',
'type': UnionType([
FloatType(min_value=0, max_value=1),
StringSelectionType(['auto']),
NoneType()], default=None)},
{'name': 'n_components',
'dispname': 'N. of components for dimensionality reduction',
'type': UnionType([
IntType(min_value=1),
NoneType(),
], default=None)},
{'name': 'store_covariance',
'dispname': 'Store covariance',
'type': BoolType(default=False)},
{'name': 'tol',
'dispname': 'Tolerance',
'type': FloatType(min_value=0.0, default=1e-4)},
]
descriptor.set_info(info, doc_class=Lda)
descriptor.set_attributes([
{'name': 'coef_', 'cnames': names_from_x},
{'name': 'intercept_'},
{'name': 'covariance_', 'cnames': names_from_x,
'rnames': names_from_x},
{'name': 'explained_variance_ratio_'},
{'name': 'means_'},
{'name': 'priors_'},
{'name': 'scalings_'},
{'name': 'xbar_'},
{'name': 'classes_', 'cnames': names_from_y},
], doc_class=Lda)
parameters = node.parameters()
SyML_abstract.generate_parameters(parameters, descriptor)
inputs = Ports([])
outputs = Ports([ModelPort('Model', 'model')])
__doc__ = SyML_abstract.generate_docstring(
'', descriptor.info, descriptor.attributes, inputs, outputs)
def execute(self, node_context):
model = node_context.output['model']
desc = self.__class__.descriptor
model.set_desc(desc)
kwargs = self.__class__.descriptor.get_parameters(
node_context.parameters)
skl = Lda(**kwargs)
model.set_skl(skl)
model.save()
[docs]
class QuadraticDiscriminantAnalysis(SyML_abstract, node.Node):
name = 'Quadratic Discriminant Analysis'
author = 'Mathias Broxvall'
icon = 'QDA.svg'
description = (
'Constructs a quadratic classifier that separates two or '
'more classes.'
)
nodeid = ('com.sympathyfordata.advancedmachinelearning'
'.quadratic_discriminant_analysis')
tags = Tags(Tag.MachineLearning.Supervised)
descriptor = DiscriminantAnalysisDescriptor()
descriptor.name = name
info = [
{'name': 'reg_param',
'dispname': 'Covariance regularization parameter',
'type': FloatType(min_value=0, max_value=1, default=0.0)},
{'name': 'store_covariance',
'dispname': 'Store covariance',
'type': BoolType(default=False)},
{'name': 'tol',
'dispname': 'Tolerance',
'type': FloatType(min_value=0.0, default=1e-4)},
]
descriptor.set_info(info, doc_class=Qda)
descriptor.set_attributes([
{'name': 'covariance_', 'cnames': names_from_x,
'rnames': names_from_x},
{'name': 'means_'},
{'name': 'priors_'},
{'name': 'scalings_'},
{'name': 'rotations_'},
], doc_class=Qda)
parameters = node.parameters()
SyML_abstract.generate_parameters(parameters, descriptor)
inputs = Ports([])
outputs = Ports([ModelPort('Model', 'model')])
__doc__ = SyML_abstract.generate_docstring(
'', descriptor.info, descriptor.attributes, inputs, outputs)
def execute(self, node_context):
model = node_context.output['model']
desc = self.__class__.descriptor
model.set_desc(desc)
kwargs = self.__class__.descriptor.get_parameters(
node_context.parameters)
skl = Qda(**kwargs)
model.set_skl(skl)
model.save()