
第一部分:選擇題(50分)
1、10分
在一個0/1 分類任務中:我們訓練了一個神經(jīng)網(wǎng)絡,對于每個樣本點,其輸出為該樣本是1類的概率:通常,我們會設置一個threshold, 如果預測的概率大于此值,則分為1類,反之為0類;假設,當threshold=0.5時, 預測結果的precision,recall分別是0.8, 0.8;此時,如果我們把threshold調高到0.6, 將會得到組新的預測結果。請問以下那組選項最有可能是這組新的預測結果的precision和recall?
A.-0.9,0.9
B.-0.9,0.7
C.-0.7,0.9
D.-0.7,0.7
思路:一般而言,p和r是兩個矛盾的指標,不能兩者都大或者都小,所以首先排除AD,當閾值調高的時候,那么需要有更大的把握,才能判斷為正類,那么查準率提高,但是相應的,許多真正的好瓜,就被分為壞瓜了,所以查全率降低。綜上所述選B。
2、5分
下面的函數(shù)不是凸函數(shù)的為:
A.f(z) = max(0,1-z)
B.f(z) = z^3
C.f(z) = exp(-z)
D.f(z) = log(1 + exp(-z))
思路:判斷一個函數(shù)是否是凸函數(shù),可以利用二階導數(shù)是否非負來判斷,那么B的二階導數(shù)是6z,明顯不滿足條件,所以選B。
3、5分
GoogleNet中的1*1卷積核的作用是()
A.降維
B.減少參數(shù)
C.跨通道通信
D.其他三個選項都包括
思路:選D
4、15分
考慮一個0/1二分類模型,模型參數(shù)為實數(shù)w,b
輸入為一個實數(shù)X,輸出Y的表達式為:

假設我們的訓練集中包含N個樣本點X[1],X[2],…,X[N](保證沒有重合點:X[i]!=X[j] if i !=j),以及每個樣本點對應的標簽Y[1],Y[2],…,Y[N]。
請問當N最大是多少時,不論訓練集中X和Y的取值如何,
我們都可能得到一個模型,其訓練誤差等于0(訓練集上的預測結果完全正確)
A.2
B.3
C.4
D.大于4


5、15分
下面的python3函數(shù),如果輸入的參數(shù)n非常大,函數(shù)的返回值會趨近于以下哪一個值?

A. 1334323 / 1679616
B. 1334324 / 1679616
C. 1334325 / 1679616
D. 1334325 / 1679616
思路:這個題就是在求,第一輪count+1,;第二輪count+1;……,第n輪count+1,的概率之和是多少。
(第一輪)
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),break的概率是:i大于(cur%x? 1000000 % 6 = 4)的概率就是1/6(注意0-5是有6個數(shù));
(2)count += 1再break的概率是:4/6
(3)不break,直接cur//x,進入第二輪的概率是1/6
(然后cur = cur //6 = 1000000 // 6 = 166666)
(cur%6 = 166666 % 6 = 4)
(第二輪)
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),如果比4大,就break(這里的概率和第一輪一樣是1/6);
(2)count += 1再break的概率是:4/6
(3)不break,直接cur//x,進入第二輪的概率是1/6
第二輪,count += 1再break的概率是1/6*4/6
進入下一輪的概率是1/6 * 1/6
(然后cur = cur //6 = 166666 // 6 = 27777)
(cur % 6 = 27777 %6 =3)
(第三輪)
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),如果比3大,就break,這里的概率是2/6;
(2)count += 1再break的概率是:3/6
(3)不break,直接cur//x的概率是1/6
第三輪,count += 1再break的概率是 1/6 * 1/6 * 3/6
進入下一輪的概率是1/6 * 1/6 * 1/6
(然后cur = cur //6 = 27777 // 6 =4629 )
(cur % 6 = 4629 % 6 =3)
(第四輪)
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),如果比3大,就break,這里的概率是2/6;
(2)count += 1再break的概率是:3/6
(3)不break,直接cur//x的概率是1/6
第四輪,count += 1再break的概率是 1/6 * 1/6? * 1/6? * 3/6
進入下一輪的概率是1/6 * 1/6 * 1/6 * 1/6
(然后cur = cur //6 = 4629 // 6 = 771)
(cur % 6 = 771 %6 =3)
(第五輪)
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),如果比3大,就break,這里的概率是2/6;
(2)count += 1再break的概率是:3/6
(3)不break,直接cur//x的概率是1/6
第五輪,count += 1再break的概率是 1/6 * 1/6? * 1/6 * 1/6? * 3/6
進入下一輪的概率是1/6 * 1/6 * 1/6 * 1/6 * 1/6
(然后cur = cur //6 = 771 // 6 = 128)
(cur %6=128%6=2)
(第六輪)
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),如果比2大,就break,這里的概率是3/6;
(2)count += 1再break的概率是:2/6
(3)不break,直接cur//x的概率是1/6
第六輪,count += 1再break的概率是 1/6 * 1/6 * 1/6 * 1/6? * 1/6 * 2/6
進入下一輪的概率是1/6 * 1/6 * 1/6 * 1/6 * 1/6* 1/6
(然后cur = cur // 6 = 128 // 6 = 21)
(cur % 6 = 21 % 6 = 3)
(第七輪)
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),如果比3大,就break,這里的概率是2/6;
(2)count += 1再break的概率是:3/6
(3)不break,直接cur//x的概率是1/6
第七輪,count += 1再break的概率是 1/6 * 1/6 * 1/6 * 1/6? * 1/6* 1/6* 3/6
進入下一輪的概率是1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 1/6
所以 1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 3/6
(然后cur = cur //6 = 21 //6 = 3)
(cur % 6 = 3 % 6 = 3 )

(第八輪)
補充知識:在C語言中,%符號表示的是求余運算,在python腳本中,%表示的是取模。
(1)i = random.randint(0,x-1)#i是0到5之間的一個隨機數(shù),如果比3大,就break,這里的概率是2/6;
(2)count += 1再break的概率是:3/6
(3)不break,直接cur//x的概率是1/6
第八輪,count += 1再break的概率是 1/6 * 1/6? * 1/6 * 1/6 * 1/6* 1/6* 1/6*1/6*3/6
進入下一輪的概率是1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 1/6*1/6
(cur // 6 = 3 //6 = 0)
(cur % 6 = 0 % 6 = 0)
循環(huán)終止
計算:
4/6 +
1/6 * 4/6 +
1/6 * 1/6 * 3/6 +
1/6 * 1/6? * 1/6 * 3/6 +
1/6 * 1/6? * 1/6 * 1/6 * 3/6+
1/6 * 1/6? * 1/6 * 1/6 * 1/6 * 2/6 +
1/6 * 1/6? * 1/6 *? 1/6 * 1/6? * 1/6 * 3/6+
1/6 * 1/6? * 1/6? * 1/6 * 1/6? * 1/6 * 1/6 * 3/6
=1334325/1679616
這道題,有好多陷阱,比如,0-5,很容易想成是5個數(shù),容易導致錯誤。另外關于在C語言中,%符號表示的是求余運算,在python腳本中,%表示的是取模。這些知識都要知道,計算的時候,要格外注意。



二、填空題
1、15分
如果利用計算機進行一項計算任務,其中的子任務T(a)所在的計算機內(nèi)部模塊A的處理時間為整個任務處理時間的40%,現(xiàn)假設模塊A的速度提升為原來的10倍,其他不變,則整個計算任務會提速為原來的(? )倍。(精確到小數(shù)點后三位)
答案:1/0.640=1.563
思路:假設原來的整個任務的時間為1,那么任務T(a)所在的模塊A的處理時間為0.4,剩下部分的處理用時為0.6,現(xiàn)在模塊A的速度提升為原來的10倍,那么處理時間變?yōu)?.04,總時間為0.6+0.04=0.64,即處理速度變?yōu)樵瓉淼?/0.64倍=1.563
2、15分
假設你訓練了一個線性回歸模型 y = w1*x1 +w2*x2 +w3*x3 +b
其中X=[x1, x2, x3]為輸入,[w1, w2, w3,b]為模型參數(shù)
已知當X=[1,2,3]時,模型的輸出為1,當X=[-1,1,4]時,模型的輸出為2
請問當X=[0.6, 1.8, 3.2]時,模型的輸出為(? )
答案:1.2
思路:

3、15分
老版微信中的【看一看】有【朋閱讀的原創(chuàng)文章】功能,當一位好友閱讀某文章后,該文章就會被系統(tǒng)匿名推薦顯示在你的微信【看一看】中,如果你嘗試逐一刪除好友,直到刪除好友后該推薦文章即刻消失,就可以斷定是TA在看該文章了。
假設有以下條件:
1:你有888位微信好友
2:你有多部手機,每部手機對應一個微信賬號,你可以任意分配組合每部手機里面的微信好友(不限數(shù)量可重復)
3.一篇推薦的文章最多只被一位好友閱讀
請問:現(xiàn)在你被推薦了1篇文章,在不進行【刪除添如好友、變更各個手機的好友組合】的前提下,至少需要( )手機才能通過遍覽各個手機的文章顯示情況就能知道是誰在看這篇文章?
例如:你有888部手機,每部手機只加一位好友,遍覽888部手機的文章顯示情況就可以找出是誰在看某篇文章。
答案:10
思路:log2(888)=9.幾
二分法,444 444,222 222,111 111,56 55, 28? 28, 14 14,7 7,4 4,2 2,1 1
4、15分
小剛用C語言實現(xiàn)了一個print_bytes函數(shù),其輸入x為一個無符號的32位整型(4個字節(jié)),然后將這4個字節(jié)依照在內(nèi)存中的存儲地址,由低到高依次輸出每個字節(jié)對應的數(shù)字。(數(shù)字之間無分隔符分割,比如4個字節(jié)分別為:0x01,0x0a, 0x02, 0x0b,那么對應的輸出為:110211)以下為對應的代碼:(僅供參考,無需閱讀此段代碼僅通過之前的題目描述仍然可以解答本題)

已知在某臺節(jié)序為little-endian的計算機下,調用該函數(shù)的輸出為:
012345
請問輸入?yún)?shù)x可能的最大值是:(? )
答案:792325
訂正:795141
思路:16進制轉10進制:0x01,0x就代表是16進制的意思,沒有實意: a代表 18,b代表11,0代表0x00,12為0x0c,34為0x22,5為0x05? ? ? ? ?
所以輸入最大為:0x00為0000 0000,0x0c為0000 1100,0x22為 0010 0010,0x05為0000 0101
拼起來:0000 0000 0000 1100 0010 0010 0000 0101=1+2^2+2^9+2^13+2^18+2^19=795141
5、29.5分
MNIST的訓練集共包600000張28x28的灰階圖片, 每張圖片上面為個手寫的0-9的數(shù)字,
小明從MNIST數(shù)據(jù)集中挑選了4張圖片(4張圖片沒有重復),將每張圖片切割成4張14x14子圖片(分別應左上角,右上角,左下角,右下角),最件得到1張14x14的子圖片。
小明不小心將這16張子圖的順序打亂了,你能幫助小明找出一開始的4張圖片所對應的數(shù)字是什么嗎?
我們將提供給你個data.npz文件,其中包含了MNIST訓練集中所有圖片的像素值和對應的數(shù)字標簽,以及16張子圖的像素值。請你告訴小明開始挑選的4張圖片上面的數(shù)字是( )?
(請將這4個數(shù)字按照從小到大的那序排列后拼接起來作為答案。比如0012)
Hint:
data.npz的讀取以及其中的內(nèi)容,可以參考如下代碼和注釋:

數(shù)據(jù)集:
見附件mnist.npz(請下載)
答案:1578
思路:



關于上述代碼的一些解釋:
(1)為什么增加了一個維度,這個維度就可以用來代替循環(huán)了。
畫圖看一下:






三、問答題(0.5分)
請簡述上面的MNIST題目的求解思路:
思路如下:首先將MNIST數(shù)據(jù)集中(60000張28x28的圖片)每張圖片分割為4張14x14的子圖(分別為左上角,右上角,左下角,右下角),然后與小明的16張14x14的圖片進行匹配,若4個角都匹配上,那么就選擇出該數(shù)字,匹配上就是直接計算L1距離為0的。