1. 程式人生 > >PCB 加投率計算實現基本原理--K最近鄰算法(KNN)

PCB 加投率計算實現基本原理--K最近鄰算法(KNN)

最近鄰 plist 控制 str 驗收 階段 分享圖片 數據量 出現

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)