[LAB 18 · XOR:信息保留与线性读出](/course/notebooks/33066318f5884adc8417068df0f40431.html) # LAB 18 · XOR:信息保留与线性读出 · 实现代码 [独立阅读](/course/notebook-blocks/c5113894a7934003bb3fd12a1d78f39c.html) 并入相关学习路径 XOR的任务信息/身份信息、离散互信息与线性读出算例 展开完整实现代码 ``` # Writable ephemeral workspace for detached readonly cloud runs. import os, tempfile os.chdir(tempfile.mkdtemp(prefix='lec03_lab21_')) import numpy as np from collections import Counter h=[(-1,-1),(-1,1),(1,-1),(1,1)]; y=[0,1,1,0]; z=[a*b for a,b in h]; c=[0]*4 def mutual(a,b): n=len(a); joint=Counter(zip(a,b)); ca=Counter(a); cb=Counter(b) return sum(v/n*np.log2(v*n/(ca[x]*cb[t])) for (x,t),v in joint.items()) def fit(X,y): X=np.c_[X,np.ones(len(y))]; w=np.zeros(X.shape[1]); y=np.array(y) for _ in range(500): p=1/(1+np.exp(-X@w)); w-=.2*X.T@(p-y)/len(y) return (1/(1+np.exp(-X@w))).round(4) print('I(h;y), I(z;y), I(constant;y) bits',mutual(h,y),mutual(z,y),mutual(c,y)) print('I(h;h), I(h;z) bits',mutual(h,h),mutual(h,z)) print('linear probabilities on h',fit(np.array(h),y).tolist(),'on z',fit(np.array(z)[:,None],y).tolist()) assert mutual(h,y)==mutual(z,y)==1 and mutual(h,h)==2 and mutual(h,z)==1 print('z keeps XOR label, loses which corner: label sufficiency is task dependent') ```