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

📄 owexampledistance.py

📁 orange源码 数据挖掘技术
💻 PY
字号:
"""
<name>Example Distance</name>
<description>Computes a distance matrix from a set of data examples.</description>
<icon>icons/ExampleDistance.png</icon>
<contact>Blaz Zupan (blaz.zupan(@at@)fri.uni-lj.si)</contact> 
<priority>1050</priority>
"""

import orange, math
import OWGUI
from qt import *
from qtcanvas import *
from OWWidget import *
import random

##############################################################################
# main class

class OWExampleDistance(OWWidget):	
    settingsList = ["Metrics"]

    def __init__(self, parent=None, signalManager = None):
        self.callbackDeposit = [] # deposit for OWGUI callback functions
        OWWidget.__init__(self, parent, signalManager, 'ExampleDistance') 

        self.inputs = [("Examples", ExampleTable, self.dataset)]
        self.outputs = [("Distance Matrix", orange.SymMatrix)]

        self.Metrics = 0
        self.loadSettings()
        self.data = None

        self.metrics = [("Euclidean", orange.ExamplesDistanceConstructor_Euclidean),
                   ("Manhattan", orange.ExamplesDistanceConstructor_Manhattan),
                   ("Hamming", orange.ExamplesDistanceConstructor_Hamming),
                   ("Relief", orange.ExamplesDistanceConstructor_Relief)]

        cb = OWGUI.comboBox(self.controlArea, self, "Metrics", box="Distance Metrics", items=[x[0] for x in self.metrics],
            tooltip="Choose metrics to measure pairwise distance between examples.",
            callback=self.computeMatrix)
        cb.setMinimumWidth(170)
        cb.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum))

        OWGUI.separator(self.controlArea)        
        self.labelCombo = OWGUI.comboBox(self.controlArea, self, "Label", box="Example Label",
            items=[],
            tooltip="Choose attribute which will be used as a label of the example.",
            callback=self.setLabel, sendSelectedValue = 1)
        
        self.labelCombo.setDisabled(1)
        self.adjustSize()

    ##############################################################################
    # callback functions

    def computeMatrix(self):
        if not self.data:
            return
        data = self.data
        dist = self.metrics[self.Metrics][1](data)
        matrix = orange.SymMatrix(len(data))
        matrix.setattr('items', data)
        for i in range(len(data)):
            for j in range(i+1):
                matrix[i, j] = dist(data[i], data[j])
        self.send("Distance Matrix", matrix)

    def setLabel(self):
        for e in self.data:
            e.name = str(e[self.Label])

    ##############################################################################
    # input signal management

    def setLabelComboItems(self):
        d = self.data
        self.labelCombo.clear()
        self.labelCombo.setDisabled(0)
        labels = [m.name for m in d.domain.getmetas().values()] + [a.name for a in d.domain.variables]
        for l in labels:
            self.labelCombo.insertItem(l)
        # here we would need to use the domain dependent setting of the label id
        self.labelCombo.setCurrentItem(0); self.Label = labels[0]
        self.setLabel()

    def dataset(self, data):
        if data and len(data.domain.attributes):
            self.data = data
            self.setLabelComboItems()
            self.computeMatrix()
        else:
            self.send("Distance Matrix", None)

##################################################################################################
# test script

if __name__=="__main__":
    import os
    if os.path.isfile(r'../../doc/datasets/glass.tab'):
        data = orange.ExampleTable(r'../../doc/datasets/glass')
    else:
        data = orange.ExampleTable('glass')
    a = QApplication(sys.argv)
    ow = OWExampleDistance()
    a.setMainWidget(ow)
    ow.show()
    ow.dataset(data)
    a.exec_loop()
    ow.saveSettings()

⌨️ 快捷键说明

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