⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 owcn2rulesviewer.py

📁 orange源码 数据挖掘技术
💻 PY
📖 第 1 页 / 共 2 页
字号:
"""
<name>CN2 Rules Viewer</name>
<description>Viewer of classification rules.</description>
<icon>CN2RulesViewer.png</icon>
<contact>Ales Erjavec (ales.erjavec(@at@)fri.uni-lj.si)</contact> 
<priority>2120</priority>
"""

import orange
import orngCN2
from OWWidget import *
import OWGUI
import OWGraphTools
import qt
from qtcanvas import *
import sys
import re

class MyCanvasView(QCanvasView):
    def __init__(self, parent, *arg):
        apply(QCanvasView.__init__,(self,)+arg)
        self.parent=parent
        self.buttonPressed=False
        self.brush=QBrush(QColor("lightGray").light(112))
        self.lastIndex=-1
        self.flag=False

    def contentsMouseMoveEvent(self,e):
        self.flag=True
        if self.buttonPressed:
            obj=self.canvas().collisions(e.pos())
            if obj and obj[-1].__class__==QCanvasRectangle and obj[-1].index!=self.lastIndex:
                self.addSelection(obj[-1])
                self.parent.select()
                self.lastIndex=obj[-1].index
    
    def contentsMousePressEvent(self,e):
        self.buttonPressed=True
        self.lastIndex=-1
        if not self.parent.ctrlPressed:
            self.parent.selRect=[]
            for r in self.parent.rectObj:
                r.setBrush(QBrush(Qt.NoBrush))
               
    def contentsMouseReleaseEvent(self,e):
        self.flag=False
        obj=self.canvas().collisions(e.pos())
        if obj and obj[-1].__class__==QCanvasRectangle and obj[-1].index!=self.lastIndex:
            self.addSelection(obj[-1])
            self.parent.select()
        self.buttonPressed=False

    def addSelection(self, rect):
        index=rect.index
        if (not self.buttonPressed and not self.flag) and not self.parent.ctrlPressed:
            self.parent.selRect=[]
            for r in self.parent.rectObj:
                r.setBrush(QBrush(Qt.NoBrush))
        if rect in self.parent.selRect:
            self.parent.selRect.remove(rect)
            rect.setBrush(QBrush(Qt.NoBrush))
        else:
            self.parent.selRect.append(rect)
            rect.setBrush(self.brush)
        self.parent.canvas.update()         

class OWCN2RulesViewer(OWWidget):
    settingsList=["RuleLen","RuleQ","Coverage","Commit","Rule","Sort","Dist","DistBar","Class"]
    callbackDeposit=[]
    def __init__(self, parent=None, signalManager=None):
        OWWidget.__init__(self, parent, signalManager,"CN2 Rules Viewer")
        
        self.inputs=[("Unordered CN2 Classifier", orngCN2.CN2UnorderedClassifier, self.data)]
        self.outputs=[("Examples", ExampleTable), ("Classified Examples", ExampleTableWithClass), ("Attribute List", AttributeList)]
        self.RuleLen=1
        self.RuleQ=1
        self.Coverage=1
        self.Class=1
        self.Dist=1
        self.DistBar=1
        self.Commit=1
        self.SelectedAttrOnly=0
        self.Rule=1
        self.Sort=0
        self.loadSettings()
        layout=QVBoxLayout(self.mainArea, QVBoxLayout.TopToBottom,0)
        self.canvas=QCanvas()
        self.canvasView=MyCanvasView(self, self.canvas, self.mainArea)
        self.canvasView.setCanvas(self.canvas)
        self.canvasView.show()
        self.headerCanvas=QCanvas()
        self.headerView=QCanvasView(self.headerCanvas, self.mainArea)
        self.headerView.setMaximumHeight(25)
        self.headerView.setHScrollBarMode(QScrollView.AlwaysOff)
        self.headerView.setVScrollBarMode(QScrollView.AlwaysOff)
        layout.addWidget(self.headerView)
        layout.addWidget(self.canvasView)
        
        box=OWGUI.widgetBox(self.controlArea,"Show info")
        box.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))

        OWGUI.checkBox(box,self,"RuleLen","Rule length",callback=self.drawRules)
        OWGUI.checkBox(box,self,"RuleQ","Rule quality",callback=self.drawRules)
        OWGUI.checkBox(box,self,"Coverage","Coverage",callback=self.drawRules)
        OWGUI.checkBox(box,self,"Class","Predicted class", callback=self.drawRules)
        OWGUI.checkBox(box,self,"Dist","Distribution", callback=self.drawRules)
        OWGUI.checkBox(box,self,"DistBar","Distribution(Bar)",callback=self.drawRules)

        OWGUI.separator(self.controlArea)
        box=OWGUI.widgetBox(self.controlArea,"Sorting")
        box.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))
        self.sortBox=OWGUI.comboBox(box, self, "Sort", 
                                    items=["No sorting", "Rule length", "Rule quality", "Coverage", "Predicted class",
                                           "Distribution","Rule"]
                                    ,callback=self.drawRules)
        OWGUI.separator(self.controlArea)
        box=OWGUI.widgetBox(self.controlArea,"Output")
        box.setSizePolicy(QSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed))
        OWGUI.checkBox(box,self,"Commit", "Commit on change")
        OWGUI.checkBox(box,self,"SelectedAttrOnly","Selected attributes only")
        OWGUI.button(box,self,"&Commit",callback=self.commit)

        QVBox(self.controlArea)
        
        OWGUI.button(self.controlArea,self,"&Save rules to file",callback=self.saveRules)

        self.examples=None
        self.obj=[]
        self.selRect=[]
        self.rectObj=[]
        
        self.ctrlPressed=False
        self.setFocusPolicy(QWidget.StrongFocus)

        self.connect(self.canvasView.horizontalScrollBar(),SIGNAL("valueChanged(int)"),
                self.headerView.horizontalScrollBar().setValue)

    def clear(self):
        for e in self.obj:
            e.setCanvas(None)
        self.obj=[]
        self.selRect=[]

    def showRules(self):
        self.clear()
        text=[]
        items=[]
        for i, r in enumerate(self.rules):
            l=[i,str(int(float(r.complexity))), "%.3f" % r.quality, "%.1f"%r.classDistribution.abs, #str(len(self.classifier.examples.filterref(r.filter))),
                str(r.classifier.defaultValue), self.distText(r), self.ruleText(r),r]
            text.append(l)
            self.distText(r)
        self.text=text
        #self.items=items
        self.drawRules()
        

    def drawRules(self):
        self.oldSelection=[r.rule for r in self.selRect]
        self.sort()
        self.clear()
        for r in self.rectObj:
            r.setCanvas(None)
        self.rectObj=[]
        text=self.text
        filter=[self.RuleLen, self.RuleQ, self.Coverage, self.Class, self.Dist or self.DistBar,self.Rule]
        l=[]
        #a=["Length","Quality","Coverage","Class","Distribution", "Distribution(Bar)", "Rule"]
        a=["Length","Quality","Coverage","Class","Distribution", "Rule"]
        for i, k in enumerate(a):
            if filter[i]:
                t=QCanvasText(self.headerCanvas)
                t.setText(k)
                l.append(t)
        l.append(QCanvasText(self.canvas))
        items=[]
        items.append(l)
        self.obj.extend(l)
        
        for text in self.text:
            l=[]
            if self.RuleLen:
                t=QCanvasText(self.canvas)
                t.setText(text[1])
                l.append(t)
            if self.RuleQ:
                t=QCanvasText(self.canvas)
                t.setText(text[2])
                l.append(t)
            if self.Coverage:
                t=QCanvasText(self.canvas)
                t.setText(text[3])
                l.append(t)
            if self.Class:
                t=QCanvasText(self.canvas)
                t.setText(text[4])
                l.append(t)
            if self.Dist and not self.DistBar:
                t=QCanvasText(self.canvas)
                t.setText(text[5])
                l.append(t)
            if self.DistBar:
                t=DistBar(text[5],self.Dist,self.canvas)
                l.append(t)                    
            if self.Rule:
                t=QCanvasText(self.canvas)
                t.setText(text[6])#self.ruleText(text[-1]))
                l.append(t)
            l.append(QCanvasText(self.canvas))
            self.obj.extend(l)
            items.append(l)
        #print len(items)
                
        textMapV=[10]+map(lambda s:max([t.boundingRect().height()+10 for t in s]), items[1:])
        textMapH=[[s[i].boundingRect().width()+10 for s in items] for i in range(len(items[0]))]
        textMapH=[10]+map(lambda s:max(s), textMapH)

        #print len(textMapV)
        for i in range(1,len(textMapV)):
            textMapV[i]+=textMapV[i-1]

        for i in range(1,len(textMapH)):
            textMapH[i]+=textMapH[i-1]
            
        self.ctrlPressed=True
        for i in range(1,len(textMapV)):
            for j in range(len(textMapH)-2):
                if items[i][j].__class__==DistBar:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -