计算g(xi) 依据“7.101 两个变量二次规划的求解方法”式7.104 :param i:x的下标 :return: g(xi)的值
(self, i)
| 145 | return False |
| 146 | |
| 147 | def calc_gxi(self, i): |
| 148 | ''' |
| 149 | 计算g(xi) |
| 150 | 依据“7.101 两个变量二次规划的求解方法”式7.104 |
| 151 | :param i:x的下标 |
| 152 | :return: g(xi)的值 |
| 153 | ''' |
| 154 | #初始化g(xi) |
| 155 | gxi = 0 |
| 156 | #因为g(xi)是一个求和式+b的形式,普通做法应该是直接求出求和式中的每一项再相加即可 |
| 157 | #但是读者应该有发现,在“7.2.3 支持向量”开头第一句话有说到“对应于α>0的样本点 |
| 158 | #(xi, yi)的实例xi称为支持向量”。也就是说只有支持向量的α是大于0的,在求和式内的 |
| 159 | #对应的αi*yi*K(xi, xj)不为0,非支持向量的αi*yi*K(xi, xj)必为0,也就不需要参与 |
| 160 | #到计算中。也就是说,在g(xi)内部求和式的运算中,只需要计算α>0的部分,其余部分可 |
| 161 | #忽略。因为支持向量的数量是比较少的,这样可以再很大程度上节约时间 |
| 162 | #从另一角度看,抛掉支持向量的概念,如果α为0,αi*yi*K(xi, xj)本身也必为0,从数学 |
| 163 | #角度上将也可以扔掉不算 |
| 164 | #index获得非零α的下标,并做成列表形式方便后续遍历 |
| 165 | index = [i for i, alpha in enumerate(self.alpha) if alpha != 0] |
| 166 | #遍历每一个非零α,i为非零α的下标 |
| 167 | for j in index: |
| 168 | #计算g(xi) |
| 169 | gxi += self.alpha[j] * self.trainLabelMat[j] * self.k[j][i] |
| 170 | #求和结束后再单独加上偏置b |
| 171 | gxi += self.b |
| 172 | |
| 173 | #返回 |
| 174 | return gxi |
| 175 | |
| 176 | def calcEi(self, i): |
| 177 | ''' |
no outgoing calls
no test coverage detected