对于许多离散问题,经过神经网络解决再通过softmax之后每一个值在[0,1]之间的连续变量,想要将其离散化,即离散化到每个元素都是 binary-variable,即 0-1 ,这时可以用KNN方法,其实就是找到与这个向量的方差最小的K个临近向量。
做个简单的示例如下:
import itertools
import numpy as np
def knn(x,N, k=4):
k_nn = np.array(list(map(list, itertools.product([0, 1], repeat=N))))
#这句话的意思是生成2^N个 0,1组成的向量,即穷尽探索空间。
# the 2-norm
sqd = ((k_nn - x) ** 2).sum(1) #计算方差
idx = np.argsort(sqd) #对方差进行排序
return k_nn[idx[:k]] #取方差最小的K个
if __name__ == '__main__':
x = [0.1, 0.3, 0.6, 0.9] #一个连续向量
N =len(x) #x的元素个数
k_neighbor= knn(x,N) #执行knn,用来保存K-neighbors
print(x)
print(k_neighbor)
k_nn = np.array(list(map(list, itertools.product([0, 1], repeat=N)))) ? ? ? ? ?
#这句话的意思是生成2^N个 0,1组成的向量,即穷尽探索空间。例如例子中 N =4, 那么k_nn是一个 2^4 = 16 行的 np.array.
结果示例: