PCB 加投率計算實現基本原理--K最近鄰算法(KNN)
PCB行業中,客戶訂購5000pcs,在投料時不會直接投5000pcs,因為實際在生產過程不可避免的造成PCB報廢,
所以在生產前需計劃多投一定比例的板板,
例:訂單 量是5000pcs,加投3%,那就是總共投料要投料5000*1.03=5150pcs。
而這個多投的訂單標準,每家工廠都可能不一樣的,因為加投比例,需要結合訂單數量,層數,銅厚,線寬,線距,
表面工藝,HDI階數,孔徑比,特殊工藝,驗收標準等等 ,所以工藝難度越大,加投量也是越多。
在這裏以K最近鄰算法(KNN)進行加投率的模似
K最近鄰 (k-Nearest Neighbors,KNN) 算法是一種分類算法,也是最簡單易懂的機器學習算法,沒有之一。1968年由 Cover 和 Hart 提出,應用場景有字符識別、文本分類、圖像識別等領域。該算法的思想是:一個樣本與數據集中的k個樣本最相似,如果這k個樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。當然實際情況不可能這麽簡單,這裏只是為了說明該算法的用法。
這裏舉例是對單個蝕刻工序加投率模擬,而對整個訂單 的加投模擬要復雜得多
先準備下面數據集中序號A1-A12為生產型號,為已知的蝕刻工序關鍵對報廢影響的關鍵參數,分為表面銅厚、線寬公差、最小線寬、最小線距4個類,
(此數據是參數對此工序的影響權重值,並非真實的值, 為了簡化:報廢多少量就是因該要加投多少量)
表格中最下的A13的生產型號,對應的關鍵參數(表面銅厚、線寬公差、最小線寬、最小線距)已有了,
但如何預測A13這款板的加投率呢。
原理:通過A13這款板的產品信息與歷史生產過的產品信息,用歐式距離是一個非常簡單又最常用的距離計算方法。
值越小,就是匹配度就越高, 而為了保證預測的結果準確,通過會將前幾個匹配度最高的值中取出現頻率最高的.
一.建立數據結構類
public class ModTechData { /// <summary> /// 生產型號 /// </summary> public string pdctno { get; set; } /// <summary> /// 表面銅厚 /// </summary> public int CuThickness { get; set; } /// <summary> /// 線寬公差/// </summary> public int Tolerance { get; set; } /// <summary> /// 最小線寬 /// </summary> public int Width { get; set; } /// <summary> /// 最小線距 /// </summary> public int Space { get; set; } /// <summary> /// 報廢率 /// </summary> public double Scrap { get; set; } /// <summary> /// KNN距離 /// </summary> public double KNN { get; set; } }
二.構建數據;
List<ModTechData> TechDataList = new List<ModTechData>() { new ModTechData(){ pdctno = "A1", CuThickness = 69, Tolerance = 3, Width = 14, Space = 14, Scrap = 0.03} ,new ModTechData(){ pdctno = "A2", CuThickness = 44, Tolerance = 35, Width = 10, Space = 10, Scrap = 0.03} ,new ModTechData(){ pdctno = "A3", CuThickness = 64, Tolerance = 11, Width = 13, Space = 13, Scrap = 0.03} ,new ModTechData(){ pdctno = "A4", CuThickness = 39, Tolerance = 0, Width = 31, Space = 31, Scrap = 0.03} ,new ModTechData(){ pdctno = "A5", CuThickness = 4, Tolerance = 2, Width = 47, Space = 47, Scrap = 0.02} ,new ModTechData(){ pdctno = "A6", CuThickness = 2, Tolerance = 1, Width = 48, Space = 48, Scrap = 0.02} ,new ModTechData(){ pdctno = "A7", CuThickness = 2, Tolerance = 3, Width = 48, Space = 48, Scrap = 0.02} ,new ModTechData(){ pdctno = "A8", CuThickness = 12, Tolerance = 8, Width = 40, Space = 40, Scrap = 0.02} ,new ModTechData(){ pdctno = "A9", CuThickness = 11, Tolerance = 75, Width = 7, Space = 7, Scrap = 0.01} ,new ModTechData(){ pdctno = "A10", CuThickness = 14, Tolerance = 61, Width = 13, Space = 13, Scrap = 0.01} ,new ModTechData(){ pdctno = "A11", CuThickness = 18, Tolerance = 75, Width = 4, Space = 4, Scrap = 0.01} ,new ModTechData(){ pdctno = "A12", CuThickness = 11, Tolerance = 45, Width = 22, Space = 22, Scrap = 0.01} };
三.計算A13數據與數據集中所有數據的距離。
ModTechData TechData = new ModTechData() { pdctno = "A13", CuThickness = 38, Tolerance = 5, Width = 28, Space = 28 }; foreach (var item in TechDataList) { var CuThicknessDiff = Math.Pow(TechData.CuThickness - item.CuThickness, 2); var ToleranceDiff = Math.Pow(TechData.Tolerance - item.Tolerance, 2); var WidthDiff = Math.Pow(TechData.Width - item.Width, 2); var SpaceeDiff = Math.Pow(TechData.Space - item.Space, 2); item.KNN = Math.Sqrt(CuThicknessDiff + ToleranceDiff + WidthDiff + SpaceeDiff); }
四.按照距離大小進行遞增排序,選取距離最小的k個樣本
由於樣本數量只有12個,取前5個匹配度最高的,如果實際應有樣本量越多可以調整K值
var TechDataSortList = TechDataList.OrderBy(tt => tt.KNN).Take(5).ToList();
五.確定前k個樣本所在類別出現的頻率,取出現頻率最高的類別
通過此算法,得到了A13這款板加投率匹配後頻率最高加投率是0.03(3%)
var TechDataGroupList =TechDataSortList.GroupBy(tt => tt.Scrap).Select(tt => new { key = tt.Key, count = tt.Count() }).ToList();
六.真實預測加率的挑戰
我們通常正常理解:比如一個產品有20個工序,將每一道工序加投率值計算出來,最終相加並得出此產品最終的加投率不就OK了嗎。
但實際並不是這麽簡單,
1.影響工序的特征值不僅限於單工序計算加投,需綜合計考慮,局部加投與綜合加投,結合分析得到最終加投率
2.不僅限於當前工序的參數影響值計算加投,需考慮前工序設備參數會對後工序的影響,對歷史生產的訂單機器設備參數采集,覆蓋越全預測才準
3.此算法是基於歷史數據預測結果,樣本量越大,樣板特征覆蓋率越全,準確率高。為了保證樣本數據量在遞增,每次加投或補投都需更新樣板庫。
4.若想預測結果準確一定要確保樣本參數與結果是OK的,不然會影響加投預測的偏差。
下圖是外層線寬控制魚骨圖,影響線寬參數如此廣泛,而想要精準預測加投率也是同樣需將影響加投的因素分析出來的。
七.KNN有幾個特點:
(1)KNN屬於惰性學習(lazy-learning)
這是與急切學習(eager learning)相對應的,因為KNN沒有顯式的學習過程!也就是說沒有訓練階段,從上面的例子就可以看出,數據集事先已有了分類和特征值,待收到新樣本後直接進行處理。
(2)KNN的計算復雜度較高
我們從上面的例子可以看到,新樣本需要與數據集中每個數據進行距離計算,計算復雜度和數據集中的數據數目n成正比,也就是說,KNN的時間復雜度為O(n),因此KNN一般適用於樣本數較少的數據集。
(3)k取不同值時,分類結果可能會有顯著不同。
一般k的取值不超過20,上限是n的開方
PCB 加投率計算實現基本原理--K最近鄰算法(KNN)