内循环启发方式2 Parameters: i - 标号为i的数据的索引值 oS - 数据结构 Ei - 标号为i的数据误差 Returns: j, maxK - 标号为j或maxK的数据的索引值 Ej - 标号为j的数据误差
(i, oS, Ei)
| 104 | return j |
| 105 | |
| 106 | def selectJ(i, oS, Ei): |
| 107 | """ |
| 108 | 内循环启发方式2 |
| 109 | Parameters: |
| 110 | i - 标号为i的数据的索引值 |
| 111 | oS - 数据结构 |
| 112 | Ei - 标号为i的数据误差 |
| 113 | Returns: |
| 114 | j, maxK - 标号为j或maxK的数据的索引值 |
| 115 | Ej - 标号为j的数据误差 |
| 116 | """ |
| 117 | maxK = -1; maxDeltaE = 0; Ej = 0 #初始化 |
| 118 | oS.eCache[i] = [1,Ei] #根据Ei更新误差缓存 |
| 119 | validEcacheList = np.nonzero(oS.eCache[:,0].A)[0] #返回误差不为0的数据的索引值 |
| 120 | if (len(validEcacheList)) > 1: #有不为0的误差 |
| 121 | for k in validEcacheList: #遍历,找到最大的Ek |
| 122 | if k == i: continue #不计算i,浪费时间 |
| 123 | Ek = calcEk(oS, k) #计算Ek |
| 124 | deltaE = abs(Ei - Ek) #计算|Ei-Ek| |
| 125 | if (deltaE > maxDeltaE): #找到maxDeltaE |
| 126 | maxK = k; maxDeltaE = deltaE; Ej = Ek |
| 127 | return maxK, Ej #返回maxK,Ej |
| 128 | else: #没有不为0的误差 |
| 129 | j = selectJrand(i, oS.m) #随机选择alpha_j的索引值 |
| 130 | Ej = calcEk(oS, j) #计算Ej |
| 131 | return j, Ej #j,Ej |
| 132 | |
| 133 | def updateEk(oS, k): |
| 134 | """ |
no test coverage detected