ML之分類預測之ElasticNet之PLoR:在二分類資料集上呼叫Glmnet庫訓練PLoR模型(T2)
阿新 • • 發佈:2019-01-06
ML之分類預測之ElasticNet之PLoR:在二分類資料集上呼叫Glmnet庫訓練PLoR模型(T2)
輸出結果
設計思路
核心程式碼
for iStep in range(nSteps): lam = lam * lamMult betaIRLS = list(beta) beta0IRLS = beta0 distIRLS = 100.0 iterIRLS = 0 while distIRLS > 0.01: iterIRLS += 1 iterInner = 0.0 betaInner = list(betaIRLS) beta0Inner = beta0IRLS distInner = 100.0 while distInner > 0.01: iterInner += 1 if iterInner > 100: break betaStart = list(betaInner) for iCol in range(ncol): sumWxr = 0.0 sumWxx = 0.0 sumWr = 0.0 sumW = 0.0 for iRow in range(nrow): x = list(xNormalized[iRow]) y = labels[iRow] p = Pr(beta0IRLS, betaIRLS, x) if abs(p) < 1e-5: p = 0.0 w = 1e-5 elif abs(1.0 - p) < 1e-5: p = 1.0 w = 1e-5 else: w = p * (1.0 - p) z = (y - p) / w + beta0IRLS + sum([x[i] * betaIRLS[i] for i in range(ncol)]) r = z - beta0Inner - sum([x[i] * betaInner[i] for i in range(ncol)]) sumWxr += w * x[iCol] * r sumWxx += w * x[iCol] * x[iCol] sumWr += w * r sumW += w avgWxr = sumWxr / nrow avgWxx = sumWxx / nrow beta0Inner = beta0Inner + sumWr / sumW uncBeta = avgWxr + avgWxx * betaInner[iCol] betaInner[iCol] = S(uncBeta, lam * alpha) / (avgWxx + lam * (1.0 - alpha)) sumDiff = sum([abs(betaInner[n] - betaStart[n]) for n in range(ncol)]) sumBeta = sum([abs(betaInner[n]) for n in range(ncol)]) distInner = sumDiff/sumBeta a = sum([abs(betaIRLS[i] - betaInner[i]) for i in range(ncol)]) b = sum([abs(betaIRLS[i]) for i in range(ncol)]) distIRLS = a / (b + 0.0001) dBeta = [betaInner[i] - betaIRLS[i] for i in range(ncol)] gradStep = 1.0 temp = [betaIRLS[i] + gradStep * dBeta[i] for i in range(ncol)] betaIRLS = list(temp) beta = list(betaIRLS) beta0 = beta0IRLS betaMat.append(list(beta)) beta0List.append(beta0) nzBeta = [index for index in range(ncol) if beta[index] != 0.0] for q in nzBeta: if not(q in nzList): nzList.append(q)