0

我正在尝试实现 MI 算法。这是我的代码:

import numpy as np
from copy import copy
from sklearn import metrics
from sklearn import preprocessing
from sklearn.datasets import load_digits

data, labels = load_digits(return_X_y=True) # labels is Y vector #data shape = (1797, 64), and labels shape is (1797,1)
(n_samples, n_features), n_digits = data.shape, np.unique(labels).size

#normalize the data and set into DataFrame
scaler = preprocessing.StandardScaler()
d = scaler.fit_transform(data)

现在这里是我对 MI 的实现:

def mi_algo(_data, _labels, size, defualt_x = 17, defualt_y = 10):  

 theta = np.zeros(_data.shape[1])
 x_len = y_len = _data.shape[0]
 py =  np.array([len(_labels[_labels==y_val])/y_len for y_val in range(defualt_y)]) #P(y)

 for col in range(len(theta)):
  temp = np.copy(_data[:,col])
  px =  np.array([len(temp[temp==x_val])/x_len for x_val in range(defualt_x)]) #P(x)
  for x in range(defualt_x):
   if px[x] == 0:
    continue
   for y in range(defualt_y):
    if py[y] == 0: 
      continue
    pxy = np.sum((temp == x) & (labels == y)) #P(x,y)
    pxy = np.divide(pxy,x_len)
    yx = np.multiply(px[x],py[y])
    pxy = np.divide(pxy, yx)
    log = np.log2(pxy)
    theta[col] += np.multiply(pxy,log)


 return theta

我使用了所有的 np,因为我遇到了一些错误。这是输出:

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:23: RuntimeWarning: divide by zero encountered in log2
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:24: RuntimeWarning: invalid value encountered in multiply
[ 0. nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan nan nan nan nan  0. nan nan nan
 nan nan nan  0. nan nan nan nan nan nan nan nan nan nan nan nan nan nan
 nan nan nan nan nan nan nan nan nan nan]

现在,我知道有一些除以零,但我无法弄清楚。谢谢你的帮助!

4

1 回答 1

0

通过检查除数是否为 0 -> 继续来解决它。

于 2021-08-06T05:53:44.600 回答