Changeset 5325


Ignore:
Timestamp:
Aug 29, 2022 11:25:20 AM (15 months ago)
Author:
vondreele
Message:

add outlier detection to cluster analysis - finds "bad data"

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIIseqGUI.py

    r5323 r5325  
    15681568    import scipy.cluster.hierarchy as SCH
    15691569    import scipy.cluster.vq as SCV
    1570     import sklearn.cluster as SKC   
     1570    import sklearn.cluster as SKC
     1571    import sklearn.ensemble as SKE
     1572    import sklearn.covariance as SKCO
     1573    import sklearn.neighbors as SKN
     1574    import sklearn.svm as SKVM
    15711575       
    15721576    SKLearnCite = '''If you use Scikit-Learn Cluster Analysis, please cite:
     
    18491853        compute = wx.Button(G2frame.dataWindow,label='Compute')
    18501854        compute.Bind(wx.EVT_BUTTON,OnCompute)
    1851         clusSizer.Add(compute)
     1855        clusSizer.Add(compute,0,WACV)
    18521856        scikitSizer.Add(clusSizer)
    18531857        useTxt = '%s used the whitened data matrix'%ClusData['Scikit']
     
    18851889            memSizer.Add(wx.StaticText(G2frame.dataWindow,label=text))       
    18861890        return memSizer
     1891   
     1892    def outlierSizer():
     1893       
     1894        def OnOutSel(event):
     1895            ClusData['OutMethod'] = outsel.GetValue()
     1896            OnCompute(event)
     1897           
     1898        def OnCompute(event):
     1899            if ClusData['OutMethod'] == 'One-Class SVM':
     1900                ClusData['codes'] = SKVM.OneClassSVM().fit_predict(ClusData['DataMatrix'])
     1901            elif ClusData['OutMethod'] == 'Isolation Forest':
     1902                ClusData['codes'] = SKE.IsolationForest().fit_predict(ClusData['DataMatrix'])
     1903            elif ClusData['OutMethod'] == 'Local Outlier Factor':
     1904                ClusData['codes'] = SKN.LocalOutlierFactor().fit_predict(ClusData['DataMatrix'])
     1905            wx.CallAfter(UpdateClusterAnalysis,G2frame,ClusData,shoNum)
     1906       
     1907        outSizer = wx.BoxSizer(wx.VERTICAL)
     1908        outSizer.Add(wx.StaticText(G2frame.dataWindow,label='Outlier (bad data) analysis with Scikit-learn:'))
     1909        choice = ['One-Class SVM','Isolation Forest','Local Outlier Factor']
     1910        outline = wx.BoxSizer(wx.HORIZONTAL)
     1911        outline.Add(wx.StaticText(G2frame.dataWindow,label='Select method: '),0,WACV)
     1912        outsel = wx.ComboBox(G2frame.dataWindow,choices=choice,style=wx.CB_READONLY|wx.CB_DROPDOWN)
     1913        outsel.SetValue(ClusData['OutMethod'])
     1914        outsel.Bind(wx.EVT_COMBOBOX,OnOutSel)
     1915        outline.Add(outsel,0,WACV)
     1916        compute = wx.Button(G2frame.dataWindow,label='Compute')
     1917        compute.Bind(wx.EVT_BUTTON,OnCompute)
     1918        outline.Add(compute,0,WACV)
     1919        outSizer.Add(outline)
     1920        return outSizer
    18871921           
    18881922    #patch
     1923    ClusData['SKLearn'] = ClusData.get('SKLearn',False)
    18891924    ClusData['plots'] = ClusData.get('plots','All')
    18901925    ClusData['Scikit'] = ClusData.get('Scikit','K-Means')
     1926    ClusData['OutMethod'] = ClusData.get('OutMethod','Isolation Forest')
    18911927    #end patch
    18921928    G2frame.dataWindow.ClearData()
     
    19581994                mainSizer.Add(subSizer,0,wx.EXPAND)
    19591995                mainSizer.Add(ScikitSizer())
     1996               
     1997        if len(ClusData['DataMatrix']) > 15:
     1998            G2G.HorizontalLine(mainSizer,G2frame.dataWindow)
     1999            mainSizer.Add(outlierSizer())
     2000            Nout = len(ClusData['codes'])-np.count_nonzero(ClusData['codes']+1)
     2001            if Nout > 0:
     2002                mainSizer.Add(wx.StaticText(G2frame.dataWindow,label='%d Probable outlier data found by %s:'%(Nout,ClusData['OutMethod'])))
     2003                text = ''
     2004                for i,item in enumerate(ClusData['Files']):
     2005                    if ClusData['codes'][i] < 0:
     2006                        text += '(%d) %s\n'%(i,item)
     2007                mainSizer.Add(wx.StaticText(G2frame.dataWindow,label=text))       
     2008            else:
     2009                mainSizer.Add(wx.StaticText(G2frame.dataWindow,label='No outlier data found'))
     2010       
     2011   
    19602012           
    19612013               
Note: See TracChangeset for help on using the changeset viewer.