分布之间的正交性
Orthogonality between distributions
我正在实施决策树算法并尝试使用正交性来衡量拆分的质量。我的理解是我将正交性计算为:
1−cosθ(Pi,Pj)
其中i为拆分前的数据分区,j为拆分后的分区。 Pi 和 Pj 是每个分区中每个目标值的概率向量。
我已经实现了以下内容,但我不确定我是否正确解释了它。我有 6 个 classes,向量 1 在 class 1 中占 66%,在 class 2 中占 33%,在剩余的 class 中占 none。向量 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 为 return 0,即它们是相同的,因此是平行的。
这让我相信我在这里误解了一些东西。有什么想法吗?
p.s。我已经查看了其他常见措施,例如基尼杂质等,它们很好,但我发现这是一种替代方法,我正在尝试衡量它的有效性。
干杯
大卫
编辑:
已找到以下http://masongallo.github.io/machine/learning,/python/2016/07/29/cosine-similarity.html
看来我的理解有偏差。如果我使用这个实现,我会得到以下结果
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 突出显示为相同。我需要更多地了解这个过程,但我认为这是正确的。
抱歉延迟 - 答案确实是根据编辑使用代码
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
我正在实施决策树算法并尝试使用正交性来衡量拆分的质量。我的理解是我将正交性计算为:
1−cosθ(Pi,Pj)
其中i为拆分前的数据分区,j为拆分后的分区。 Pi 和 Pj 是每个分区中每个目标值的概率向量。
我已经实现了以下内容,但我不确定我是否正确解释了它。我有 6 个 classes,向量 1 在 class 1 中占 66%,在 class 2 中占 33%,在剩余的 class 中占 none。向量 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 为 return 0,即它们是相同的,因此是平行的。
这让我相信我在这里误解了一些东西。有什么想法吗?
p.s。我已经查看了其他常见措施,例如基尼杂质等,它们很好,但我发现这是一种替代方法,我正在尝试衡量它的有效性。
干杯
大卫
编辑:
已找到以下http://masongallo.github.io/machine/learning,/python/2016/07/29/cosine-similarity.html
看来我的理解有偏差。如果我使用这个实现,我会得到以下结果
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 突出显示为相同。我需要更多地了解这个过程,但我认为这是正确的。
抱歉延迟 - 答案确实是根据编辑使用代码
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