分布之间的正交性

时间:2018-01-07 16:53:42

标签: python vector decision-tree orthogonal

我正在实施决策树算法,并尝试使用Orthogonality来衡量分割的质量。我的理解是我将Orthogonality计算为:

1-cosθ(Pi,Pj)

其中i是拆分前的数据分区,j是拆分后的分区。 Pi和Pj是每个分区中每个目标值的概率向量。

我已经实现了以下内容,但我不确定我是否正确地解释了这一点。我有6个班级,向量1在1级有66%,在2级有33%,在剩下的班级没有。载体2和3具有相同的分布(40%,10%,10%,20%,10%,10%)

import numpy as np

def calculate_orthogonality(vector_1, vector_2):

    dot_product = np.dot(vector_1, vector_2)
    orthogonality = 1 - np.cos(dot_product)

    return orthogonality

vector1 = [0.6666666666666666, 0.3333333333333333, 0, 0, 0, 0]
vector2 = [0.4, 0.1, 0.1, 0.2, 0.1, 0.1]
vector3 = [0.4, 0.1, 0.1, 0.2, 0.1, 0.1]

print(calculate_orthogonality(vector1,vector2))
print(calculate_orthogonality(vector1,vector3))
print(calculate_orthogonality(vector2,vector3))

0.0446635108744
0.0446635108744
0.028662025148

特别是我希望vector2和3返回0,即它们是相同的,因此是平行的。

这让我相信我在这里误解了一些东西。有什么想法吗?

P.S。我已经看过其他常见的措施,如基尼杂质等,它们很好,但我已经把它作为一种替代方案,我试图衡量它的有效性。

干杯

大卫

编辑:

找到以下https://stackoverflow.com/a/48121777/8820330

在我的理解中,我似乎已经离开了。如果我使用此实现,我会得到以下

import numpy as np

def cos_sim(a, b):
    """Takes 2 vectors a, b and returns the cosine similarity according
    to the definition of the dot product
    """
    dot_product = np.dot(a, b)
    norm_a = np.linalg.norm(a)
    norm_b = np.linalg.norm(b)
    return dot_product / (norm_a * norm_b)

vector1 = [0.6666666666666666, 0.3333333333333333, 0, 0, 0, 0]
vector2 = [0.4, 0.1, 0.1, 0.2, 0.1, 0.1]
vector3 = [0.4, 0.1, 0.1, 0.2, 0.1, 0.1]

print(cos_sim(vector1,vector2))
print(cos_sim(vector1,vector3))
print(cos_sim(vector2,vector3))

0.821583836258
0.821583836258
1.0

向量2和3突出显示为相同。我需要更多地了解这个过程,但我认为这是正确的。

1 个答案:

答案 0 :(得分:0)

很抱歉延迟 - 答案确实是根据编辑

使用代码
import numpy as np

def cos_sim(a, b):
    """Takes 2 vectors a, b and returns the cosine similarity according
    to the definition of the dot product
    """
    dot_product = np.dot(a, b)
    norm_a = np.linalg.norm(a)
    norm_b = np.linalg.norm(b)
    return dot_product / (norm_a * norm_b)

vector1 = [0.6666666666666666, 0.3333333333333333, 0, 0, 0, 0]
vector2 = [0.4, 0.1, 0.1, 0.2, 0.1, 0.1]
vector3 = [0.4, 0.1, 0.1, 0.2, 0.1, 0.1]

print(cos_sim(vector1,vector2))
print(cos_sim(vector1,vector3))
print(cos_sim(vector2,vector3))

0.821583836258
0.821583836258
1.0