110 經濟部聯招(台電、中油、台水、台糖)新進職員 統計資訊 國營事業聯招 (資料庫及資料探勘、程式設計)B 考古題詳解
第 一 題20 分
BIRCH 是一個階層式分群(hierarchical clustering)方法,可以處理大量資料,以及避免雜訊(noisy)資料的問題,請簡答以下題目:(4 題,每題 5 分,共 20 分)
(一) 此方法適用何種資料型態? (二) 此方法利用一種 tree 資料結構,請說明 internal 節點(除 pointer 之外)儲存何種資料? (三) 此資料結構透過何種機制,達成可處理大量資料,不受記憶體大小限制? (四) BIRCH 建構完成 tree 後,可再採用其他分群組方法,假設採用 -means clustering,以 elbow curve method 決定群組個數 ,請說明 elbow curve method 之做法。
登入後即可作答並保存紀錄。
核心觀念
本題考查 BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)的四項核心設計:
- 適用的資料型態。
- CF Tree(Clustering Feature Tree)節點所儲存的摘要資訊。
- 透過資料壓縮與增量式處理降低記憶體需求。
- 使用 -means 後,以 Elbow Curve Method 決定群組數 。
BIRCH 的重點不是直接保存所有原始資料,而是將相近資料點彙整成少量的群集特徵(Clustering Feature, CF),藉此建立階層式摘要結構。
(一)此方法適用何種資料型態?
解題方法
BIRCH 主要適用於:
- 數值型資料(numeric data)。
- 多維度數值資料。
- 可計算距離,尤其是採用歐幾里得距離的資料。
BIRCH 透過資料點的線性總和與平方和計算群集的質心、半徑與直徑,因此必須能進行數值運算。
對於一個群集 ,BIRCH 以:
表示其特徵,其中:
- :資料點數量。
- (Linear Sum):各資料點向量的總和。
- (Squared Sum):各資料點各維度平方和的總和。
若資料點為 維向量,則:
因此,BIRCH 最適合可使用距離或相似度衡量的數值型資料。
作答重點
BIRCH 主要適用於大量的數值型、多維度資料,且資料點之間必須能計算距離;典型情況是使用歐幾里得距離的資料。
對純類別型資料,不能直接套用上述 CF 的數值摘要方式,必須先進行適當的數值化或改用適合類別資料的分群方法。
(二)Internal 節點除 pointer 之外儲存何種資料?
解題方法
BIRCH 使用 CF Tree。每一個 CF 代表一個子群集的摘要資料:
其中:
- :該子群集包含的資料點數量。
- :所有資料點的向量總和。
- :所有資料點平方後的總和。
在 internal node 中,每個 entry 通常包含:
- 一個 CF 值,用來描述該子樹所涵蓋資料的群集特徵。
- 一個指向子節點的 pointer。
題目已說明 pointer 不計,因此應回答 internal node 儲存該子樹的 CF 摘要資訊,即 、、。
CF 可推導的資訊
由 CF 可計算該群集的質心:
也可計算半徑或直徑等群集緊密程度資訊。例如,群集半徑可由群內資料點到質心的平均平方距離推導:
因此,BIRCH 不必保留每一個原始資料點,只要保留 CF,即可進行後續的距離與群集判斷。
作答重點
Internal 節點除了子節點 pointer 外,儲存其子樹所代表群集的 CF(Clustering Feature),包括:
即資料筆數、線性總和與平方和。
(三)如何處理大量資料,降低記憶體限制?
解題方法
BIRCH 採用「增量式掃描」與「資料壓縮摘要」機制。
資料點逐筆讀入時,先依據距離尋找 CF Tree 中最接近的子群集。若加入後仍符合指定的 Threshold,便將該資料點合併至既有 CF;若超過 Threshold,則建立新的 CF entry。
CF 合併具有可加性:
因此,許多原始資料點可以被壓縮成少數 CF entry,而不需要全部保存在記憶體中。
主要機制
-
逐筆或分批讀取資料 不必一次將整個資料集載入記憶體。
-
以 CF 摘要取代原始資料點 每一群相近資料只保留 、、 等統計資訊。
第 二 題10 分
資料探勘常用歐幾里得距離來定義相似度(或不相似度),資料前處理時,常需對每一欄位分別做正規化(或稱標準化)。(共 2 題,共 10 分)
(一) 請說明正規化之目的。(1 分) (二) 請說明常用之 3 種正規化方法。(每個答案 3 分,共 9 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查資料探勘中的「資料正規化(Normalization)」:將不同欄位的數值轉換到可比較的尺度,使歐幾里得距離不會被數值範圍較大的欄位主導。
對兩筆資料 與 ,歐幾里得距離為
若某欄位的數值範圍遠大於其他欄位,該欄位的差異經平方後會占據距離的大部分,使其他欄位的資訊被忽略。
(一)正規化之目的
正規化的主要目的,是將不同欄位的數值轉換至相近的尺度,使各欄位在距離計算、分群、分類及相似度分析中具有合理且公平的影響力。
正規化可避免下列問題:
- 消除不同欄位間的量綱差異,例如年齡以「歲」表示、收入以「元」表示。
- 避免數值範圍較大的欄位支配歐幾里得距離。
- 提升分群、最近鄰分類及其他距離型演算法的分析效果。
- 使資料更容易進行比較與後續模型訓練。
(二)常用的 3 種正規化方法
1. 最小值—最大值正規化(Min-Max Normalization)
將原始資料線性轉換至指定區間,最常見的是 。
若原始資料為 ,該欄位的最小值與最大值分別為 與 ,欲轉換至 ,公式為
當指定區間為 時,公式簡化為
其中:
- 原始最小值會轉換為 ;
- 原始最大值會轉換為 ;
- 其他數值依比例落在 之間。
例如某欄位最小值為 、最大值為 ,資料值為 ,則
此方法保留原始資料的相對順序與比例關係,但容易受到極端值影響。若日後出現超過原最大值或低於原最小值的新資料,轉換結果可能超出原設定區間。
2. 分數正規化(Z-Score Normalization)
利用欄位的平均數與標準差進行轉換,使資料以平均數為中心,並以標準差作為尺度。
公式為
其中:
- 為欄位 的平均數;
- 為欄位 的標準差。
若使用樣本資料計算標準差,也可寫成
第 三 題20 分
請針對下表的資料進行關聯規則分析,資料為購買商品的交易紀錄,設定最小支持度 與最小信心度 為強關聯規則的最低門檻。請寫出以下商品的所有強關聯規則(僅列出「若 與 ,則 」之強關聯規則即可,如:「」)。(每個答案 5 分,共 20 分)
| TID | ITEMS_BOUGHT |
|---|---|
| T1 | A, B, E |
| T2 | B, C, D, E |
| T3 | B, F |
| T4 | A, D, E |
| T5 | A, B, D, E |
| T6 | C, D, G |
登入後即可作答並保存紀錄。
核心觀念
本題考查關聯規則分析中的兩項指標:
1. 支持度(Support)
對規則 而言:
本題共有 筆交易,最小支持度為 ,因此規則至少須出現:
交易筆數必須為整數,故至少出現 次。
2. 信心度(Confidence)
本題最小信心度為 。
題目限定規則形式為「兩項商品 一項商品」,因此需檢查所有三項商品組合,再將其中兩項作為前件、另一項作為後件。
解題方法
先統計各商品組合的出現次數。三項商品組合至少須出現 次,才能符合最小支持度。
符合支持度門檻的三項商品組合如下:
| 三項商品組合 | 出現交易 | 次數 | 支持度 |
|---|---|---|---|
| T1、T5 | 2 | ||
| T2、T5 | 2 | ||
| T4、T5 | 2 |
其餘三項商品組合皆未達 次,不符合最小支持度。
一、由 產生的規則
相關交易為 T1、T5,因此:
- 出現於 T1、T5,共 次
- 出現於 T1、T4、T5,共 次
- 出現於 T1、T2、T5,共 次
支持度與信心度皆達門檻,成立。
未達 ,不成立。
未達 ,不成立。
二、由 產生的規則
相關交易為 T2、T5,因此:
第 四 題15 分
下列問題,請用遞迴(Recursive)的方式來撰寫:(共 2 題,共 15 分)
(一) 實驗室培養某細胞,此細胞區分為成年與幼年細胞。每個成年細胞於 1 個月後會生出 2 個幼年細胞,幼年細胞於 1 個月後會變為成年細胞。請用遞迴方式撰寫一函式 CellNumber,輸入為 個月後,其傳回為 個月後細胞的總數。(8 分) (二) 請用遞迴方式撰寫一函式 GCD,輸入為 2 個正整數,其傳回為此 2 個正整數之最大公因數。(7 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查遞迴函式的設計,重點包括:
- 設定適當的基底條件(Base Case)。
- 找出目前問題與較小規模問題之間的遞迴關係。
- 確保每次遞迴呼叫都使問題規模縮小,最後能回到基底條件。
- 最大公因數使用歐幾里得演算法(Euclidean Algorithm)。
(一)細胞總數函式 CellNumber
解題方法
假設第 個月開始時有 個成年細胞,且沒有幼年細胞。
設:
- :第 個月的成年細胞數
- :第 個月的幼年細胞數
- :第 個月的細胞總數
每個月的變化如下:
- 成年細胞仍然存在,並且每個成年細胞產生 個幼年細胞。
- 幼年細胞經過 個月後變為成年細胞。
因此:
細胞總數為:
代入上式:
又因為第 個月的成年細胞,於第 個月會變成幼年細胞;可整理得到:
基底條件
第 個月:
第 個月:
- 原本的成年細胞仍為成年細胞 個
- 產生幼年細胞 個
所以:
遞迴程式
Function CellNumber(N)
If N = 0 Then
Return 1
Else If N = 1 Then
Return 3
Else
Return CellNumber(N - 1) + 2 * CellNumber(N - 2)
End If
End Function
範例驗算
因此細胞總數依序為:
解題技巧與常見陷阱
- 必須先明確設定第 個月的初始細胞狀態。本解採「開始時有 個成年細胞」的標準假設。
- 成年細胞不會消失,幼年細胞才會在下一個月轉為成年細胞。
第 五 題15 分
某銀行有多台取號機供民眾取號,每台取號機提供多項服務的取號,同一服務會依據各取號機之取號的先後時間,依序給予連續的號碼,且最小的號碼為 1。請使用下列所有的函式來撰寫一取號函式 GetNumber,輸入為服務代碼與鎖定號碼變數失敗的上限次數,其傳回為此服務的下一個號碼,但當鎖定號碼變數失敗超過其上限次數時,則傳回 0。(15 分)
int lock(int serviceid):鎖定指定服務代碼的號碼變數。輸入為服務代碼,其傳回為是否鎖定成功,當鎖定成功時,則傳回 1,當鎖定失敗時,則傳回 0。unlock(int serviceid):解鎖指定服務代碼的號碼變數。輸入為服務代碼。int get(int serviceid):取得指定服務代碼的號碼變數之值。輸入為服務代碼。set(int serviceid, int value):設定指定服務代碼的號碼變數之值。輸入為服務代碼與此服務代碼的號碼變數欲設定之值。sleep():執行暫停 0.1 秒。
登入後即可作答並保存紀錄。
核心觀念
本題考查「互斥鎖(mutex)」與「臨界區(critical section)」的使用。
同一服務的號碼變數會被多台取號機共同存取,因此「讀取目前號碼、更新下一個號碼」必須在鎖定狀態下完成,避免兩台取號機同時讀到相同號碼,造成重複發號。
臨界區的正確操作順序為:
- 嘗試鎖定服務號碼變數。
- 鎖定成功後取得目前號碼。
- 將號碼加一並寫回。
- 解鎖。
- 回傳原本取得的號碼。
若鎖定失敗,累計失敗次數;當失敗次數超過輸入的上限時,回傳 。
解題方法
設目前服務的號碼變數為 。因為最小號碼為 ,第一次成功取號時應回傳 ,並將號碼變數更新為 :
鎖定成功後,get 與 set 必須連續執行,且在 unlock 前完成,這段程式就是臨界區。
int GetNumber(int serviceid, int maxFail)
{
int failCount = 0;
while (1)
{
if (lock(serviceid) == 1)
{
int number = get(serviceid);
set(serviceid, number + 1);
unlock(serviceid);
return number;
}
failCount++;
if (failCount > maxFail)
{
return 0;
}
sleep;
}
}
流程說明如下:
lock(serviceid) == 1:表示成功取得該服務號碼變數的鎖。get(serviceid):讀出目前應發出的號碼。set(serviceid, number + 1):將下一次應發出的號碼寫回。unlock(serviceid):完成更新後立即解鎖,讓其他取號機可以使用。- 每次鎖定失敗,
failCount加一。
第 六 題20 分
某電梯管理系統控制多台電梯,當某樓層之等待區按下按鈕時,會將其樓層號碼傳送到系統之共用 Queue 中,系統會定時自共用 Queue 中讀取一筆目標樓層號碼,並尋找離此目標樓層最近的電梯來提供服務。請使用下列所有的函式,來撰寫一選取電梯函式 SelElev,輸入為電梯的總數,其傳回為離目標樓層最近的電梯號碼,但當未選擇到電梯時,則傳回 0。另外,當電梯總數為 時,電梯號碼為 1 到 ;樓層號碼為 1 代表 1 樓、2 代表 2 樓、0 代表地下 1 樓、 代表地下 2 樓(依此類推)。(20 分)
int getqueue():自共用 Queue 中取得下一筆目標樓層號碼。其傳回為下一筆目標樓層號碼,當無資料時,則傳回 999。int getcurfloor(int elevid):取得指定電梯目前所在的樓層。輸入為電梯號碼,其傳回為此電梯目前所在的樓層,但當此電梯不提供服務時,則傳回 999。
登入後即可作答並保存紀錄。
核心觀念
本題考查「Queue 取資料」、「逐一搜尋」及「最小值選擇」:
- 使用
getqueue取得等待乘客的目標樓層。 - 若 Queue 無資料,
getqueue回傳999,此時不選擇任何電梯,回傳0。 - 電梯編號為 到 ,逐一使用
getcurfloor(elevid)取得目前樓層。 getcurfloor回傳999表示該電梯不提供服務,必須跳過。- 可服務電梯與目標樓層的距離為:
距離最小者即為應選擇的電梯。
由於樓層可能包含負值,例如地下 1 樓為 、地下 2 樓為 ,因此必須使用絕對值計算樓層距離。
解題方法
設:
target:Queue 取出的目標樓層bestElev:目前找到的最佳電梯號碼bestDist:目前最小距離
處理步驟如下:
- 呼叫
getqueue取得目標樓層。 - 若
target == 999,表示沒有等待資料,直接回傳0。 - 將
bestElev設為0,表示目前尚未找到可服務電梯。 - 將
bestDist設為最大整數。 - 以迴圈檢查電梯 到 :
- 呼叫
getcurfloor(i)。 - 若回傳
999,跳過該電梯。 - 計算該電梯與目標樓層的距離。
- 若距離小於目前最小距離,更新最佳電梯。
- 迴圈結束後回傳
bestElev。 - 若所有電梯均不提供服務,
bestElev仍為0,符合題目要求。
參考程式碼
#include <stdlib.h>
#include <limits.h>
int SelElev(int N)
{
int target;
int bestElev = 0;
int bestDist = INT_MAX;
int i;
target = getqueue;
/* Queue 無資料 */
if (target == 999 || N <= 0)
return 0;
for (i = 1; i <= N; i++)
{
int curfloor;
int distance;
curfloor = getcurfloor(i);
/* 電梯不提供服務 */
if (curfloor == 999)
continue;
distance = abs(curfloor - target);
if (distance < bestDist)
{
bestDist = distance;
bestElev = i;
}
}
return bestElev;
}