计算核函数 使用的是高斯核 详见“7.3.3 常用核函数” 式7.90 :return: 高斯核矩阵
(self)
| 82 | |
| 83 | |
| 84 | def calcKernel(self): |
| 85 | ''' |
| 86 | 计算核函数 |
| 87 | 使用的是高斯核 详见“7.3.3 常用核函数” 式7.90 |
| 88 | :return: 高斯核矩阵 |
| 89 | ''' |
| 90 | #初始化高斯核结果矩阵 大小 = 训练集长度m * 训练集长度m |
| 91 | #k[i][j] = Xi * Xj |
| 92 | k = [[0 for i in range(self.m)] for j in range(self.m)] |
| 93 | |
| 94 | #大循环遍历Xi,Xi为式7.90中的x |
| 95 | for i in range(self.m): |
| 96 | #每100个打印一次 |
| 97 | #不能每次都打印,会极大拖慢程序运行速度 |
| 98 | #因为print是比较慢的 |
| 99 | if i % 100 == 0: |
| 100 | print('construct the kernel:', i, self.m) |
| 101 | #得到式7.90中的X |
| 102 | X = self.trainDataMat[i, :] |
| 103 | #小循环遍历Xj,Xj为式7.90中的Z |
| 104 | # 由于 Xi * Xj 等于 Xj * Xi,一次计算得到的结果可以 |
| 105 | # 同时放在k[i][j]和k[j][i]中,这样一个矩阵只需要计算一半即可 |
| 106 | #所以小循环直接从i开始 |
| 107 | for j in range(i, self.m): |
| 108 | #获得Z |
| 109 | Z = self.trainDataMat[j, :] |
| 110 | #先计算||X - Z||^2 |
| 111 | result = (X - Z) * (X - Z).T |
| 112 | #分子除以分母后去指数,得到的即为高斯核结果 |
| 113 | result = np.exp(-1 * result / (2 * self.sigma**2)) |
| 114 | #将Xi*Xj的结果存放入k[i][j]和k[j][i]中 |
| 115 | k[i][j] = result |
| 116 | k[j][i] = result |
| 117 | #返回高斯核矩阵 |
| 118 | return k |
| 119 | |
| 120 | def isSatisfyKKT(self, i): |
| 121 | ''' |