0

11個の属性を持つデータがあります。これらの各属性の距離を計算したいと思います。たとえば、その属性(x1, x2, ..., x11)と for x1&x2には名義型がx3, x4, ... x10あり、序数型があり、次にx11バイナリ型があります。Pythonを使用して属性を読み取るにはどうすればよいですか? Pythonでこれらの属性を区別する方法と、距離を計算できるようにPythonでこれらの属性を区別する方法を教えてください。誰かが私に何をすべきか教えてもらえますか? ありがとうございました

サンプルデータ: x1 (林業,プランテーション,その他,林業) x2 (プランテーション, プランテーション, 低木, 森林) x3 (高、高、中、低) x4 (低、中、高、高) x5 (高、低、中) 、高) x6 (中、低、高、中) x7 (3、1、0、4) x8 (低、低、高、中) x9 (297、298、299、297) x10 (1、2、0) 、 4) x11 (t、t、t、f)

4

2 に答える 2

0

これを次のように書き直しました。

最初に Nominal タイプのファクトリを作成します。

class BaseNominalType:
    name_values = {}   # <= subclass must override this

    def __init__(self, name):
        self.name = name
        self.value = self.name_values[name]

    def __str__(self):
        return self.name

    def __sub__(self, other):
        assert type(self) == type(other), "Incompatible types, subtraction is undefined"
        return self.value - other.value

# class factory function
def make_nominal_type(name_values):
    try:
        nv = dict(name_values)
    except ValueError:
        nv = {item:i for i,item in enumerate(name_values)}

    # make custom type
    class MyNominalType(BaseNominalType):
        name_values = nv
    return MyNominalType

これで、名義型を定義できます。

Forest = make_nominal_type(["shrubs", "plantation", "forestry", "other"])
Level  = make_nominal_type(["low", "medium", "high"])
Bool   = make_nominal_type({"f":False, "t":True})

次に、MixedVector タイプのファクトリを作成します。

# base class
class BaseMixedVectorType:
    types = []          # <= subclass must
    distance_fn = None  # <=   override these

    def __init__(self, values):
        self.values = [type_(value) for type_,value in zip(self.types, values)]

    def dist(self, other):
        return self.distance_fn([abs(s - o) for s,o in zip(self.values, other.values)])

# class factory function
def make_mixed_vector_type(types, distance_fn):
    tl = list(types)
    df = distance_fn

    class MyVectorType(BaseMixedVectorType):
        types = tl
        distance_fn = df
    return MyVectorType

次に、データ型を作成し、

# your mixed-vector type
DataItem = make_mixed_vector_type(
    [Forest, Forest, Level, Level, Level, Level, int, Level, int, int, Bool],
    ??? # have to define an appropriate distance function!
)

...しかし待ってください、距離関数を定義していません! 次の形式で、好きな距離関数をプラグインできるようにクラスを作成しました。

def manhattan_dist(_, vector):
    return sum(vector)

def euclidean_dist(_, vector):
    return sum(v*v for v in vector) ** 0.5

# the distance function per your description:
def fractional_match_distance(_, vector):
    return float(sum(not v for v in vector)) / len(vector)

作成を終了します

# your mixed-vector type
DataItem = make_mixed_vector_type(
    [Forest, Forest, Level, Level, Level, Level, int, Level, int, int, Bool],
    fractional_match_distance
)

そしてそれを次のようにテストします

def main():
    raw_data = [
        ('forestry', 'plantation', 'high', 'low', 'high', 'medium', 3, 'low', 297, 1, 't'),
        ('plantation', 'plantation', 'high', 'medium', 'low', 'low', 1, 'low', 298, 2, 't'),
        ('other', 'shrubs', 'medium', 'high', 'medium', 'high', 0, 'high', 299, 0, 't'),
        ('forestry', 'forestry', 'low', 'high', 'high', 'medium', 4, 'medium', 297, 4, 'f')
    ]

    a, b, c, d = [DataItem(d) for d in raw_data]

    print("a to b, dist = {}".format(a.dist(b)))
    print("b to c, dist = {}".format(b.dist(c)))
    print("c to d, dist = {}".format(c.dist(d)))

if __name__=="__main__":
    main()

それは私たちに与えます

a to b, dist = 0.363636363636
b to c, dist = 0.0909090909091
c to d, dist = 0.0909090909091
于 2014-04-05T19:21:50.460 に答える