selectJ(返回最优的j和Ej) 内循环的启发式方法。 选择第二个(内循环)alpha的alpha值 这里的目标是选择合适的第二个alpha值以保证每次优化中采用最大步长。 该函数的误差与第一个alpha值Ei和下标i有关。 Args: i 具体的第i一行 oS optStruct对象 Ei 预测结果与真实结果比对,计算误差Ei Returns: j 随机选出的第j一行 Ej 预测结果与真实结果比对,计算误差Ej
(i, oS, Ei)
| 125 | |
| 126 | |
| 127 | def selectJ(i, oS, Ei): # this is the second choice -heurstic, and calcs Ej |
| 128 | """selectJ(返回最优的j和Ej) |
| 129 | |
| 130 | 内循环的启发式方法。 |
| 131 | 选择第二个(内循环)alpha的alpha值 |
| 132 | 这里的目标是选择合适的第二个alpha值以保证每次优化中采用最大步长。 |
| 133 | 该函数的误差与第一个alpha值Ei和下标i有关。 |
| 134 | Args: |
| 135 | i 具体的第i一行 |
| 136 | oS optStruct对象 |
| 137 | Ei 预测结果与真实结果比对,计算误差Ei |
| 138 | |
| 139 | Returns: |
| 140 | j 随机选出的第j一行 |
| 141 | Ej 预测结果与真实结果比对,计算误差Ej |
| 142 | """ |
| 143 | maxK = -1 |
| 144 | maxDeltaE = 0 |
| 145 | Ej = 0 |
| 146 | # 首先将输入值Ei在缓存中设置成为有效的。这里的有效意味着它已经计算好了。 |
| 147 | oS.eCache[i] = [1, Ei] |
| 148 | |
| 149 | # print 'oS.eCache[%s]=%s' % (i, oS.eCache[i]) |
| 150 | # print 'oS.eCache[:, 0].A=%s' % oS.eCache[:, 0].A.T |
| 151 | # """ |
| 152 | # # 返回非0的:行列值 |
| 153 | # nonzero(oS.eCache[:, 0].A)= ( |
| 154 | # 行: array([ 0, 2, 4, 5, 8, 10, 17, 18, 20, 21, 23, 25, 26, 29, 30, 39, 46,52, 54, 55, 62, 69, 70, 76, 79, 82, 94, 97]), |
| 155 | # 列: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0]) |
| 156 | # ) |
| 157 | # """ |
| 158 | # print 'nonzero(oS.eCache[:, 0].A)=', nonzero(oS.eCache[:, 0].A) |
| 159 | # # 取行的list |
| 160 | # print 'nonzero(oS.eCache[:, 0].A)[0]=', nonzero(oS.eCache[:, 0].A)[0] |
| 161 | # 非零E值的行的list列表,所对应的alpha值 |
| 162 | validEcacheList = nonzero(oS.eCache[:, 0].A)[0] |
| 163 | if (len(validEcacheList)) > 1: |
| 164 | for k in validEcacheList: # 在所有的值上进行循环,并选择其中使得改变最大的那个值 |
| 165 | if k == i: |
| 166 | continue # don't calc for i, waste of time |
| 167 | |
| 168 | # 求 Ek误差:预测值-真实值的差 |
| 169 | Ek = calcEk(oS, k) |
| 170 | deltaE = abs(Ei - Ek) |
| 171 | if (deltaE > maxDeltaE): |
| 172 | # 选择具有最大步长的j |
| 173 | maxK = k |
| 174 | maxDeltaE = deltaE |
| 175 | Ej = Ek |
| 176 | return maxK, Ej |
| 177 | else: # 如果是第一次循环,则随机选择一个alpha值 |
| 178 | j = selectJrand(i, oS.m) |
| 179 | |
| 180 | # 求 Ek误差:预测值-真实值的差 |
| 181 | Ej = calcEk(oS, j) |
| 182 | return j, Ej |
| 183 | |
| 184 |
no test coverage detected