Вычисление мер подобия и расстояний в ML

машинное обучение искусственный интеллект Python GitHub
Вычисление мер подобия и расстояний в ML

предисловие

В машинном обучении часто используются формулы для вычисления расстояния и сходства. При выполнении классификации часто необходимо вычислить меру сходства между разными выборками. Для вычисления этой меры мы обычно используем метод вычисления количества выборок. " между ними. Например, при использовании k-средних для кластеризации для определения категории, к которой принадлежит индивидуум, необходимо использовать формулу расчета расстояния для получения расстояния между выборкой и центром кластера.При использовании kNN для классификации сходство между индивидуумом и известной категорией также рассчитывается, так что определите категорию, к которой принадлежит индивидуум.

В этой статье представлен обзор часто используемых мер подобия.

  1. Евклидово расстояние
  2. Манхэттенское расстояние
  3. Расстояние Чебышева
  4. расстояние Минковского
  5. Расстояние Махаланобиса
  6. Угловой косинус
  7. Расстояние Хэмминга
  8. Расстояние Жаккара и коэффициент подобия Жаккара
  9. Коэффициент корреляции и расстояние корреляции
  10. Информационная энтропия

1. Евклидово расстояние

Евклидово расстояние — это самый простой для понимания метод расчета расстояния, также известный как евклидово расстояние.европейское пространствоФормула расстояния между двумя точками в формуле относится к реальному расстоянию между двумя точками в m-мерном пространстве Евклидово расстояние широко используется в машинном обучении, а также является более общей кластеризацией.

1.1 Евклидово расстояние в двумерном пространстве

Две точки в двумерном пространствеa(x_1, y_1)иb(x_2, y_2)Евклидово расстояние между

d_{12}=\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}

Реализация Python:

def euclidean2(a, b):
    distance = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 )
    return distance
print ('a, b两点之间的欧式距离为: ', euclidean2((1,1),(2,2)))

1.2 Евклидово расстояние в трехмерном пространстве

две точки в трехмерном пространствеa(x_1, y_1, z_1)​иb(x_2, y_2, z_2)​Евклидово расстояние между

d_{1, 2} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_i-z_2)^2}

Реализация Python:

def euclidean3(a, b):
    distance = sqrt( (a[0]-b[0])**2 + (a[1]-b[1])**2 + (a[2]-b[2])**2 )
    return distance
print ('a, b两点之间的欧式距离为: ', euclidean3((1,1,1),(2,2,2))))

1.3 Евклидово расстояние в многомерном пространстве

Две точки в многомерном пространствеa(x_{1,1} \cdots,x_{1n})иb(x_{2,1}, \cdots, x_{2n})Евклидово расстояние между

d_{1, 2} = \sqrt{\sum^{n}_{k=1}(x_{1k}-x_{2k})^2}

Реализация Python:

def euclideann(a, b):
    sum = 0
    for i in range(len(a)):
        sum += (a[i]-b[i])** 2
    distance = np.sqrt(sum)
    return distance
print ('n 维空间a, b两点之间的欧式距离为: ', euclideann((1,1,2,2),(2,2,4,4)))

def euclideann2(a, b):
    """
    不使用循环
    """
    A = np.array(a)
    B = np.array(b)
    c = (A - B) ** 2
    distance = np.sqrt(sum(c))
    return distance
print ('n 维空间a, b两点之间的欧式距离为: ', euclideann2((1,1,2,2),(2,2,4,4)))

Здесь вы можете пройти в пунктах в любом пространстве широты

1.4 Стандартизированное евклидово расстояние

Когда прямоугольная область сгруппирована, обычная формула расчета расстояния не может соответствовать требованиям.Большинство сгруппированных областей представляют собой круглые области после расчета в соответствии с обычным расстоянием.В это время необходимо использовать стандартизированную формулу расчета евклидова расстояния.

Определение стандартного евклидова расстояния

  Стандартизированное евклидово расстояние — это улучшенное решение недостатков простого евклидова расстояния.

Идея стандартного евклидова расстояния: Поскольку распределение размерных компонентов данных отличается, хорошо! Затем я сначала «нормализую» каждый компонент, чтобы иметь одинаковое среднее значение и дисперсию.

Насколько нормированы среднее значение и дисперсия?

Давайте сначала рассмотрим некоторые статистические знания Предполагая, что среднее (среднее) выборочного набора X равно m, а стандартное отклонение (стандартное отклонение) равно s, тогда «стандартизованная переменная» X выражается как:

X^*=\frac{X-m}{s}

А математическое ожидание стандартизованной переменной равно 0, а дисперсия равна 1.

Поэтому процесс стандартизации выборочной совокупности описывается формулой:

Нормализованное значение = (значение до нормализации - среднее значение компонентов) / стандартное отклонение компонентов

После простого вывода можно получить два n-мерных вектораa(x_{11},x_{12},\cdots,x_{1n})иb(x_{21},x_{22},\cdots,x_{2n})Формула нормированного евклидова расстояния между:

d_{12}=\sqrt{\sum^{n}_{k=1}(\frac{x_{1k}-x_{2k}}{S_k})^2}

вS_kстандартное отклонение компонентов

Формула стандартного отклонения:S=\sqrt{\frac{\sum^{n}_{i=1}(s_i-\overline{s})^2}{n}}

Если обратную дисперсию рассматривать как вес, эту формулу можно рассматривать как своего родаВзвешенное евклидово расстояние.

Реализация Python:

def euclideans(a, b):
    """
    标准化欧氏距离
    """
    sumnum = 0
    for i in range(len(a)):
        # 计算si 分量标准差
        avg = (a[i] - b[i]) / 2
        si = np.sqrt( (a[i]-avg)**2 + (b[i]-avg)**2 )
        sumnum += ((a[i]-b[i]) / si) **2
    distance = np.sqrt(sumnum)
    return distance
print ('a, b两点的标准化欧氏距离为: ', euclideann2((1,2,1,2),(3,3,3,4)))

2. Манхэттенское расстояние

О способе расчета этого расстояния можно догадаться из названия. Представьте, что вы едете от одного перекрестка Манхэттена к другому. Является ли расстояние, пройденное автомобилем, расстоянием по прямой между двумя точками? По-видимому, нет, если только вы не сможете пройти через здание. Фактическое расстояние вождения - это «Манхэттенское расстояние». Отсюда и происходит название Манхэттенское расстояние, также известное как Манхэттенское расстояние.Расстояние городского квартала.

2.1 Манхэттенское расстояние в двумерном пространстве

Две точки в двумерном пространствеa(x_1, y_1)иb(x_2, y_2)Манхэттен расстояние между

d_{12}=\left|{x_1-x_2}\right|+\left|y_1-y_2\right|

Реализация Python:

def manhattan2(a, b):
    """
    二维空间曼哈顿距离
    """
    distance = np.abs(a[0] - b[0]) + np.abs(a[1] - b[1])
    return distance
print ('二维空间a, b两点之间的曼哈顿距离为: ', manhattan((1,1),(2,2)))

2.2 Манхэттенское расстояние в многомерном пространстве

Две точки в многомерном пространствеa(x_{1,1} \cdots,x_{1n})иb(x_{2,1}, \cdots, x_{2n})Евклидово расстояние между

d_{12}=\sum^{n}_{k=1}\left|x_{1k}-x_{2k}\right|

Реализация Python:

def manhattann(a, b):
    """
    n维空间曼哈顿距离
    """
    distance = 0 
    for i in range(len(a)):
        distance += np.abs(a[i]-b[i])
    return distance
print ('n维空间a, b两点之间的曼哈顿距离为: ', manhattann((1,1,2,2),(2,2,4,4)))

def manhattann2(a, b):
    """
    n维空间曼哈顿距离, 不使用循环
    """
    A = np.array(a)
    B = np.array(b)
    distance = sum(np.abs(A-B))
    return distance
print ('n维空间a, b两点之间的曼哈顿距离为: ', manhattann2((1,1,2,2),(2,2,4,4)))

Поскольку расчет размерного расстояния является более гибким, он также подходит для двухмерного и трехмерного измерения.

3. Расстояние Чебышева

Любой, кто играл в шахматы, знает, что король может одним ходом переместиться на любую из 8 соседних клеток. потом король из пледа(x_1, y_1)перейти к сетке(x_2, y_2)Какое минимальное количество шагов требуется? Вы обнаружите, что минимальное количество шагов всегдаmax(\left|x_2-x_1\right|, \left|y_2-y_1\right|)шаг . Существует аналогичная мера расстояния, называемая расстоянием Чебышева. в этой статьеМанхэттенское расстояние,Евклидово расстояние,Мин расстояние,Расстояние ЧебышеваРазнице дается очень яркое объяснение следующим образом:

比如,有同样两个人,在纽约准备到北京参拜天安门,同一个地点出发的话,按照欧式距离来计算,是完全一样的。

但是按照切比雪夫距离,这是完全不同的概念了。

譬如,其中一个人是土豪,另一个人是中产阶级,第一个人就能当晚直接头等舱走人,而第二个人可能就要等机票什么时候打折再去,或者选择坐船什么的。

这样来看的话,距离是不是就不一样了呢?

或者还是不清楚,我再说的详细点。

同样是这两个人,欧式距离是直接算最短距离的,而切比雪夫距离可能还得加上财力,比如第一个人财富值100,第二个只有30,虽然物理距离一样,但是所包含的内容却是不同的。

Как показано на рисунке: красный, синий и желтый — манхэттенские расстояния, зеленый — евклидовы расстояния.

3.1 Двумерное расстояние Чебышева

Две точки в двумерном пространствеa(x_1, y_1)иb(x_2, y_2)Чебышев расстояние между

d_{12}=max(\left|{x_1-x_2}\right|,\left|y_1-y_2\right|)

Реализация Python:

def chebyshev2(a, b):
    """
    二维空间切比雪夫距离
    """
    distance = max(abs(a[0]-b[0]), abs(a[1]-b[1]))
    return distance
print ('二维空间a, b两点之间的欧式距离为: ', chebyshev2((1,2),(3,4)))

3.2 Расстояние Голубя Чебышева

Две точки в многомерном пространствеa(x_{1,1} \cdots,x_{1n})иb(x_{2,1}, \cdots, x_{2n})Чебышев расстояние между

d_{12}=\underset{i}{max}(\left|x_{1i}-x_{2i}\right|)

Эта формула эквивалентна:

d_{12}=\lim\limits_{k\rightarrow\infty}(\sum_{i=1}^{n}\left|x_{1i}-x_{2i}\right|^k)^{\frac{1}{k}}(Это можно доказать с помощью законов масштабирования и щипка)

Реализация Python:

def chebyshevn(a, b):
    """
    n维空间切比雪夫距离
    """
    distance = 0
    for i in range(len(a)):
        if (abs(a[i]-b[i]) > distance):
            distance = abs(a[i]-b[i])
    return distance
print ('n维空间a, b两点之间的切比雪夫距离为:' , chebyshevn((1,1,1,1),(3,4,3,4)))

def chebyshevn2(a, b):
    """
    n维空间切比雪夫距离, 不使用循环
    """
    distance = 0
    A = np.array(a)
    B = np.array(b)
    distance = max(abs(A-B))
    return distance

print ('n维空间a, b两点之间的切比雪夫距离为:' , chebyshevn2((1,1,1,1),(3,4,3,4)))

4. Расстояние Минковского

Минимальное расстояние для краткости

Расстояние Мина - это не расстояние, а определение набора расстояний

4.1 Определения

Две точки в n-мерном пространствеa(x_{1,1} \cdots,x_{1n})иb(x_{2,1}, \cdots, x_{2n})Расстояние Минковского между ними определяется как:

d_{12}=\sqrt[p]{\sum^{n}_{k=1}\left|x_{1k}-x_{2k}\right|^p}

где p — переменный параметр.

Когда p = 1, это манхэттенское расстояние.

Когда p = 2, это евклидово расстояние

При p→∞ это расстояние Чебышева

В зависимости от переменных параметров расстояние Мина может представлять собой класс расстояний.

4.2 Недостаток расстояния Минковского

Расстояние Мина, включая манхэттенское расстояние, евклидово расстояние и расстояние Чебышева, имеют очевидные недостатки.

Например: двумерная выборка (рост, вес), где диапазон роста 150~190, диапазон веса 50~60, имеется три выборки: а(180,50), б(190,50), с(180, 60). Тогда расстояние Мина между a и b (будь то манхэттенское расстояние, евклидово расстояние или расстояние Чебышева) равно расстоянию Мина между a и c, но действительно ли 10 см роста эквивалентны 10 кг веса? Поэтому очень проблематично использовать расстояние Мина для измерения сходства между этими выборками.

Короче говоря, есть два основных недостатка расстояния Мина: (1) Масштаб каждого компонента, то есть «единицы», считается одним и тем же. (2) не учитывает, что распределения (ожидания, отклонения и т. д.) отдельных компонентов могут быть разными.

Реализация Python:

def minkowski(a, b):
    """
    闵可夫斯基距离
    """
    A = np.array(a)
    B = np.array(b)
    #方法一:根据公式求解
    distance1 = np.sqrt(np.sum(np.square(A-B)))
    
    #方法二:根据scipy库求解
    from scipy.spatial.distance import pdist
    X = np.vstack([A,B])
    distance2 = pdist(X)[0]
    return distance1, distance2
print ('二维空间a, b两点之间的闵可夫斯基距离为:' , minkowski((1,1),(2,2))[0])

5. Расстояние Махаланобиса

Имеется M выборочных векторовX_1~X_m, ковариационная матрица обозначается как S, а среднее значение обозначается как вектор μ, тогда расстояние Махаланобиса от выборочного вектора X до u выражается как

D(X)=\sqrt{(X-\mu)^TS^{-1}(X-\mu)}

а векторX_iиX_jРасстояние Махаланобиса между ними определяется как:

D(X_i, X_j)=\sqrt{(X_i-X_j)^TS^{-1}(X_i-X_j)}

Если ковариационная матрица является единичной матрицей (независимой и одинаково распределенной среди каждого вектора выборки), то формула принимает вид:

$D(X_i, X_j)=\sqrt{(X_i-X_j)^T(X_i-X_j)}

Это евклидово расстояние.

Если ковариационная матрица является диагональной матрицей, формула становится нормализованным евклидовым расстоянием.

Преимущества и недостатки расстояния Махаланобиса: размерность (масштаб) не имеет значения, что исключает влияние корреляции между переменными.

Реализация Python:

def mahalanobis (a, b):
    """
    马氏距离
    """
    A = np.array(a)
    B = np.array(b)
    #马氏距离要求样本数要大于维数,否则无法求协方差矩阵
    #此处进行转置,表示10个样本,每个样本2维
    X = np.vstack([A,B])
    XT = X.T
    
    #方法一:根据公式求解
    S = np.cov(X)   #两个维度之间协方差矩阵
    SI = np.linalg.inv(S) #协方差矩阵的逆矩阵
    #马氏距离计算两个样本之间的距离,此处共有10个样本,两两组合,共有45个距离。
    n = XT.shape[0]
    distance1 = []
    for i in range(0, n):
        for j in range(i+1, n):
            delta = XT[i] - XT[j]
            d = np.sqrt(np.dot(np.dot(delta,SI),delta.T))
            distance1.append(d)
            
    #方法二:根据scipy库求解
    from scipy.spatial.distance import pdist
    distance2 = pdist(XT,'mahalanobis')
    return  distance1, distance2
print ('(1, 2),(1, 3),(2, 2),(3, 1)两两之间的闵可夫斯基距离为:' , mahalanobis((1, 1, 2, 3),(2, 3, 2, 1))[0])

6. Косинус прилежащего угла

Косинус прилежащего угла в геометрии можно использовать для измерения разницы в направлении двух векторов, и эта концепция заимствована в машинном обучении для измерения разницы между выборочными векторами.

6.1 Угловое косинусное подобие двумерных пространственных векторов

вектор в 2D пространствеA(x_1, y_1)с векторомB(x_2, y_2)Формула косинуса прилежащего угла:

cos\theta = \frac{x_1x_2+y_1y_2}{\sqrt{{x_1}^2+{y_1}^2}\sqrt{{x_2}^2+{y_2}^2}}

Реализация Python:

def cos2(a, b):
    cos = (a[0]*b[0] + a[1]*b[1]) / (np.sqrt(a[0]**2 + a[1]**2) * np.sqrt(b[0]**2+b[1]**2))
    return cos
print ('a,b 二维夹角余弦距离:',cos2((1,1),(2,2)))

6.2 Угловое косинусное подобие векторов многомерного пространства.

Две n-мерные точки выборкиa(x_{1,1} \cdots,x_{1n})иb(x_{2,1}, \cdots, x_{2n})косинус угла между

Понятие, подобное косинусу прилежащего угла, можно использовать для измерения сходства между двумя точками выборки.

cos\theta=\frac{a \cdot b}{\left|a\right|\left|b\right|}

который:

cos\theta=\frac{\sum^n_{k=1}x_{1k}x_{2k}}{\sqrt{\sum^n_{k=1}x_{1k}^2}\sqrt{\sum^n_{k=1}x_{2k}^2}}

Реализация Python:

def cosn(a, b):
    """
    n维夹角余弦
    """
    sum1 = sum2 = sum3 = 0
    for i in range(len(a)):
        sum1 += a[i] * b[i]
        sum2 += a[i] ** 2
        sum3 += b[i] ** 2
    cos = sum1 / (np.sqrt(sum2) * np.sqrt(sum3))
    return cos
print ('a,b 多维夹角余弦距离:',cosn((1,1,1,1),(2,2,2,2)))

def cosn2(a, b):
    """
    n维夹角余弦, 不使用循环
    """
    A, B = np.array(a), np.array(b)
    sum1 = sum(A * B)
    sum2 = np.sqrt(np.sum(A**2))
    sum3 = np.sqrt(np.sum(B**2))
    cos = sum1 / (sum2 * sum3)
    return cos
print ('a,b 多维夹角余弦距离:',cosn2((1,1,1,1),(2,2,2,2)))

Диапазон значений косинуса прилежащего угла: [-1,1]. Чем больше косинус угла, тем меньше угол между двумя векторами, и чем меньше косинус угла, тем больше угол между двумя векторами. Когда направления двух векторов совпадают, косинус прилежащего угла принимает максимальное значение 1, а когда направления двух векторов полностью противоположны, косинус прилежащего угла принимает минимальное значение -1.

7. Расстояние Хэмминга

7.1 Определения

Расстояние Хэмминга между двумя строками одинаковой длины s1 и s2 определяется как минимальное количество подстановок, необходимых для замены одной строки на другую. Например, расстояние Хэмминга между строками «1111» и «1001» равно 2.

Применение: Кодирование информации (для повышения отказоустойчивости минимальное расстояние Хемминга между кодами должно быть максимально большим).

Реализация Python:

def hamming(a, b):
    """
    汉明距离
    """
    sumnum = 0
    for i in range(len(a)):
        if a[i]!=b[i]:
            sumnum += 1
    return sumnum
print ('a,b 汉明距离:',hamming((1,1,2,3),(2,2,1,3)))

def hamming2(a, b):
    """
    汉明距离, 不使用循环
    """
    matV = np.array(a) - np.array(b)
    numsum = len(np.nonzero(matV)[0])
    return numsum
print ('a,b 汉明距离:',hamming2((1,1,2,3),(2,2,1,3)))

8. Коэффициент сходства Жаккара и расстояние Жаккара

8.1 Коэффициент подобия Жаккара

Доля элементов пересечения двух множеств А и В в объединении А и В называется коэффициентом подобия Жаккара двух множеств с символомJ(A,B)Выражать.

J(A,B)=\frac{\left|A\cap B\right|}{|A \cup B|}

Коэффициент сходства Жаккара является мерой сходства между двумя множествами.

Реализация Python:

def jaccard_coefficient(a, b):
    """
    杰卡德相似系数
    """
    set_a = set(a)
    set_b = set(b)
    distance = float(len(set_a & set_b)) / len(set_a | set_b)
    return distance
print ('a,b 杰卡德相似系数:', jaccard_coefficient((1,2,3),(2,3,4)))

8.2 Расстояние Жаккара

Понятие, противоположное коэффициенту подобия Жаккара, — это расстояние Жаккара. Расстояние Жаккара можно выразить следующей формулой:

J_\delta(A,B)=1-J(A,B)=\frac{|A\cup B|-|A\cap B|}{|A\cup B|}

Расстояние Жаккара измеряет различие между двумя наборами по доле различных элементов во всех элементах двух наборов.

Реализация Python:

def jaccard_distance(a, b):
    """
    杰卡德距离
    """
    set_a = set(a)
    set_b = set(b)
    distance = float(len(set_a | set_b) - len(set_a & set_b)) / len(set_a | set_b)
    return distance
print ('a,b 杰卡德距离:', jaccard_coefficient((1,2,3),(2,3,4)))

8.3 Применение коэффициента подобия Жаккара и расстояния Жаккара

Коэффициент сходства Жаккара можно использовать для измерения сходства выборок.

Образец A и образец B представляют собой два n-мерных вектора, а значения всех размерностей равны 0 или 1. Например: А(0111) и В(1011). Мы рассматриваем образец как набор, 1 означает, что набор содержит элемент, 0 означает, что набор не содержит элемента.

p : количество измерений, в которых образцы A и B равны 1

q : количество измерений, где образец A равен 1, а образец B равен 0.

r : количество измерений, где образец A равен 0, а образец B равен 1.

s : количество измерений, в которых образцы A и B равны 0

Тогда коэффициент подобия Жаккара образцов A и B может быть выражен как:

Здесь p+q+r можно понимать как количество элементов объединения A и B, а p — количество элементов пересечения A и B.

Расстояние Жаккара между образцами A и B выражается как:

J = \frac{p}{p+q+r}

9. Коэффициент корреляции и корреляционное расстояние

####9.1 Определение коэффициента корреляции

\rho_{XY}=\frac{Cov(X,Y)}{\sqrt{D(X)}\sqrt{D(Y)}}=\frac{E((X-EX)(Y-EY))}{\sqrt{D(X)}\sqrt{D(Y)}}

Коэффициент корреляции — это метод измерения степени корреляции между случайными величинами X и Y. Диапазон значений коэффициента корреляции — [-1, 1]. Чем больше абсолютное значение коэффициента корреляции, тем выше корреляция между X и Y. Когда X и Y связаны линейно, коэффициент корреляции принимает значение 1 (положительная линейная корреляция) или -1 (отрицательная линейная корреляция).

Реализация Python:

Коэффициент корреляции можно использоватьnumpyв библиотекеcorrcoefфункция для расчета Например, для матрицыa,numpy.corrcoef(a)Коэффициент корреляции между строками можно рассчитать,numpy.corrcoef(a,rowvar=0)Используется для вычисления коэффициента корреляции между столбцами, и на выходе получается матрица коэффициентов корреляции.

def correlation_coefficient():
    """
    相关系数
    """
    a = np.array([[1, 1, 2, 2, 3], [2, 2, 3, 3, 5], [1, 4, 2, 2, 3]])
    print ('a的行之间相关系数为: ', np.corrcoef(a))
    print ('a的列之间相关系数为: ', np.corrcoef(a,rowvar=0))
correlation_coefficient()

9.2 Определение корреляционного расстояния

D_{xy}=1-\rho_{XY}

Реализация Python:(на основе коэффициента корреляции) То же самое для матрицы a

def correlation_distance():
    """
    相关距离
    """
    a = np.array([[1, 1, 2, 2, 3], [2, 2, 3, 3, 5], [1, 4, 2, 2, 3]])
    print ('a的行之间相关距离为: ', np.ones(np.shape(np.corrcoef(a)),int) - np.corrcoef(a))
    print ('a的列之间相关距离为: ', np.ones(np.shape(np.corrcoef(a,rowvar = 0)),int) - np.corrcoef(a,rowvar = 0))
correlation_distance()

10. Информационная энтропия

Информационная энтропия также называется энтропией Шеннона. Информационная энтропия — это не мера подобия, а мера того, насколько хаотичным или разбросанным является распределение. Чем более рассредоточено распределение (или более равномерно), тем больше информационная энтропия. Чем упорядоченнее распределение (или более концентрированное распределение), тем меньше информационная энтропия.

Формула для расчета информационной энтропии заданного выборочного набора X:

Entropy(X) = \sum^n_{i=1}-p_ilog_2p_i

Значение параметров:

n: количество классификаций в выборке X

пи: первый в XiВероятность появления элемента класса

Чем больше информационная энтропия, тем более разбросана классификация выборки S, а чем меньше информационная энтропия, тем более концентрирована классификация выборки X. Когда вероятность появления n категорий в S одинакова (все равны 1/n), информационная энтропия принимает максимальное значение log2(n). Когда X имеет только одну категорию, информационная энтропия принимает минимальное значение 0

Реализация Python:

def calc_entropy(x):
    """
    计算信息熵
    """
    x_value_list = set([x[i] for i in range(x.shape[0])])
    ent = 0.0
    for x_value in x_value_list:
        p = float(x[x == x_value].shape[0]) / x.shape[0]
        logp = np.log2(p)
        ent -= p * logp
    return ent

def calc_condition_entropy(x, y):
    """
    计算条件信息熵
    """

    # calc ent(y|x)
    x_value_list = set([x[i] for i in range(x.shape[0])])
    ent = 0.0
    for x_value in x_value_list:
        sub_y = y[x == x_value]
        temp_ent = calc_entropy(sub_y)
        ent += (float(sub_y.shape[0]) / y.shape[0]) * temp_ent
    return ent

def calc_entropy_grap(x,y):
    """
    计算信息增益
    """

    base_ent = calc_entropy(y)
    condition_ent = calc_condition_entropy(x, y)
    ent_grap = base_ent - condition_ent
    return ent_grap