Changeset 4068 for trunk/sources/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/1.6.3/LibSVM-1.6.3/Kernel.cs
- Timestamp:
- 07/22/10 00:44:01 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.ExtLibs/HeuristicLab.LibSVM/1.6.3/LibSVM-1.6.3/Kernel.cs
r2645 r4068 1 1 using System; 2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 2 6 namespace SVM 7 { 8 internal interface IQMatrix 9 { 10 float[] GetQ(int column, int len); 11 float[] GetQD(); 12 void SwapIndex(int i, int j); 3 namespace SVM { 4 internal interface IQMatrix { 5 float[] GetQ(int column, int len); 6 float[] GetQD(); 7 void SwapIndex(int i, int j); 8 } 9 10 internal abstract class Kernel : IQMatrix { 11 private Node[][] _x; 12 private double[] _xSquare; 13 14 private KernelType _kernelType; 15 private int _degree; 16 private double _gamma; 17 private double _coef0; 18 19 public abstract float[] GetQ(int column, int len); 20 public abstract float[] GetQD(); 21 22 public virtual void SwapIndex(int i, int j) { 23 _x.SwapIndex(i, j); 24 25 if (_xSquare != null) { 26 _xSquare.SwapIndex(i, j); 27 } 13 28 } 14 29 15 internal abstract class Kernel : IQMatrix 16 { 17 private Node[][] _x; 18 private double[] _xSquare; 30 private static double powi(double value, int times) { 31 double tmp = value, ret = 1.0; 19 32 20 private KernelType _kernelType; 21 private int _degree; 22 private double _gamma; 23 private double _coef0; 33 for (int t = times; t > 0; t /= 2) { 34 if (t % 2 == 1) ret *= tmp; 35 tmp = tmp * tmp; 36 } 37 return ret; 38 } 24 39 25 public abstract float[] GetQ(int column, int len); 26 public abstract float[] GetQD(); 40 public double KernelFunction(int i, int j) { 41 switch (_kernelType) { 42 case KernelType.LINEAR: 43 return dot(_x[i], _x[j]); 44 case KernelType.POLY: 45 return powi(_gamma * dot(_x[i], _x[j]) + _coef0, _degree); 46 case KernelType.RBF: 47 return Math.Exp(-_gamma * (_xSquare[i] + _xSquare[j] - 2 * dot(_x[i], _x[j]))); 48 case KernelType.SIGMOID: 49 return Math.Tanh(_gamma * dot(_x[i], _x[j]) + _coef0); 50 case KernelType.PRECOMPUTED: 51 return _x[i][(int)(_x[j][0].Value)].Value; 52 default: 53 return 0; 54 } 55 } 27 56 28 public virtual void SwapIndex(int i, int j) 29 { 30 _x.SwapIndex(i, j); 57 public Kernel(int l, Node[][] x_, Parameter param) { 58 _kernelType = param.KernelType; 59 _degree = param.Degree; 60 _gamma = param.Gamma; 61 _coef0 = param.Coefficient0; 31 62 32 if (_xSquare != null) 33 { 34 _xSquare.SwapIndex(i, j); 35 } 63 _x = (Node[][])x_.Clone(); 64 65 if (_kernelType == KernelType.RBF) { 66 _xSquare = new double[l]; 67 for (int i = 0; i < l; i++) 68 _xSquare[i] = dot(_x[i], _x[i]); 69 } else _xSquare = null; 70 } 71 72 private static double dot(Node[] xNodes, Node[] yNodes) { 73 double sum = 0; 74 int xlen = xNodes.Length; 75 int ylen = yNodes.Length; 76 int i = 0; 77 int j = 0; 78 Node x = xNodes[0]; 79 Node y = yNodes[0]; 80 while (true) { 81 if (x._index == y._index) { 82 sum += x._value * y._value; 83 i++; 84 j++; 85 if (i < xlen && j < ylen) { 86 x = xNodes[i]; 87 y = yNodes[j]; 88 } else if (i < xlen) { 89 x = xNodes[i]; 90 break; 91 } else if (j < ylen) { 92 y = yNodes[j]; 93 break; 94 } else break; 95 } else { 96 if (x._index > y._index) { 97 ++j; 98 if (j < ylen) 99 y = yNodes[j]; 100 else break; 101 } else { 102 ++i; 103 if (i < xlen) 104 x = xNodes[i]; 105 else break; 106 } 36 107 } 108 } 109 return sum; 110 } 37 111 38 private static double powi(double value, int times) 39 { 40 double tmp = value, ret = 1.0; 112 private static double computeSquaredDistance(Node[] xNodes, Node[] yNodes) { 113 Node x = xNodes[0]; 114 Node y = yNodes[0]; 115 int xLength = xNodes.Length; 116 int yLength = yNodes.Length; 117 int xIndex = 0; 118 int yIndex = 0; 119 double sum = 0; 41 120 42 for (int t = times; t > 0; t /= 2) 43 { 44 if (t % 2 == 1) ret *= tmp; 45 tmp = tmp * tmp; 46 } 47 return ret; 121 while (true) { 122 if (x._index == y._index) { 123 double d = x._value - y._value; 124 sum += d * d; 125 xIndex++; 126 yIndex++; 127 if (xIndex < xLength && yIndex < yLength) { 128 x = xNodes[xIndex]; 129 y = yNodes[yIndex]; 130 } else if (xIndex < xLength) { 131 x = xNodes[xIndex]; 132 break; 133 } else if (yIndex < yLength) { 134 y = yNodes[yIndex]; 135 break; 136 } else break; 137 } else if (x._index > y._index) { 138 sum += y._value * y._value; 139 if (++yIndex < yLength) 140 y = yNodes[yIndex]; 141 else break; 142 } else { 143 sum += x._value * x._value; 144 if (++xIndex < xLength) 145 x = xNodes[xIndex]; 146 else break; 48 147 } 148 } 49 149 50 public double KernelFunction(int i, int j) 51 { 52 switch (_kernelType) 53 { 54 case KernelType.LINEAR: 55 return dot(_x[i], _x[j]); 56 case KernelType.POLY: 57 return powi(_gamma * dot(_x[i], _x[j]) + _coef0, _degree); 58 case KernelType.RBF: 59 return Math.Exp(-_gamma * (_xSquare[i] + _xSquare[j] - 2 * dot(_x[i], _x[j]))); 60 case KernelType.SIGMOID: 61 return Math.Tanh(_gamma * dot(_x[i], _x[j]) + _coef0); 62 case KernelType.PRECOMPUTED: 63 return _x[i][(int)(_x[j][0].Value)].Value; 64 default: 65 return 0; 66 } 67 } 150 for (; xIndex < xLength; xIndex++) { 151 double d = xNodes[xIndex]._value; 152 sum += d * d; 153 } 68 154 69 public Kernel(int l, Node[][] x_, Parameter param) 70 { 71 _kernelType = param.KernelType; 72 _degree = param.Degree; 73 _gamma = param.Gamma; 74 _coef0 = param.Coefficient0; 155 for (; yIndex < yLength; yIndex++) { 156 double d = yNodes[yIndex]._value; 157 sum += d * d; 158 } 75 159 76 _x = (Node[][])x_.Clone(); 160 return sum; 161 } 77 162 78 if (_kernelType == KernelType.RBF) 79 { 80 _xSquare = new double[l]; 81 for (int i = 0; i < l; i++) 82 _xSquare[i] = dot(_x[i], _x[i]); 83 } 84 else _xSquare = null; 85 } 86 87 private static double dot(Node[] xNodes, Node[] yNodes) 88 { 89 double sum = 0; 90 int xlen = xNodes.Length; 91 int ylen = yNodes.Length; 92 int i = 0; 93 int j = 0; 94 Node x = xNodes[0]; 95 Node y = yNodes[0]; 96 while (true) 97 { 98 if (x._index == y._index) 99 { 100 sum += x._value * y._value; 101 i++; 102 j++; 103 if (i < xlen && j < ylen) 104 { 105 x = xNodes[i]; 106 y = yNodes[j]; 107 } 108 else if (i < xlen) 109 { 110 x = xNodes[i]; 111 break; 112 } 113 else if (j < ylen) 114 { 115 y = yNodes[j]; 116 break; 117 } 118 else break; 119 } 120 else 121 { 122 if (x._index > y._index) 123 { 124 ++j; 125 if (j < ylen) 126 y = yNodes[j]; 127 else break; 128 } 129 else 130 { 131 ++i; 132 if (i < xlen) 133 x = xNodes[i]; 134 else break; 135 } 136 } 137 } 138 return sum; 139 } 140 141 private static double computeSquaredDistance(Node[] xNodes, Node[] yNodes) 142 { 143 Node x = xNodes[0]; 144 Node y = yNodes[0]; 145 int xLength = xNodes.Length; 146 int yLength = yNodes.Length; 147 int xIndex = 0; 148 int yIndex = 0; 149 double sum = 0; 150 151 while (true) 152 { 153 if (x._index == y._index) 154 { 155 double d = x._value - y._value; 156 sum += d * d; 157 xIndex++; 158 yIndex++; 159 if (xIndex < xLength && yIndex < yLength) 160 { 161 x = xNodes[xIndex]; 162 y = yNodes[yIndex]; 163 } 164 else if(xIndex < xLength){ 165 x = xNodes[xIndex]; 166 break; 167 } 168 else if(yIndex < yLength){ 169 y = yNodes[yIndex]; 170 break; 171 }else break; 172 } 173 else if (x._index > y._index) 174 { 175 sum += y._value * y._value; 176 if (++yIndex < yLength) 177 y = yNodes[yIndex]; 178 else break; 179 } 180 else 181 { 182 sum += x._value * x._value; 183 if (++xIndex < xLength) 184 x = xNodes[xIndex]; 185 else break; 186 } 187 } 188 189 for (; xIndex < xLength; xIndex++) 190 { 191 double d = xNodes[xIndex]._value; 192 sum += d * d; 193 } 194 195 for (; yIndex < yLength; yIndex++) 196 { 197 double d = yNodes[yIndex]._value; 198 sum += d * d; 199 } 200 201 return sum; 202 } 203 204 public static double KernelFunction(Node[] x, Node[] y, Parameter param) 205 { 206 switch (param.KernelType) 207 { 208 case KernelType.LINEAR: 209 return dot(x, y); 210 case KernelType.POLY: 211 return powi(param.Degree * dot(x, y) + param.Coefficient0, param.Degree); 212 case KernelType.RBF: 213 { 214 double sum = computeSquaredDistance(x, y); 215 return Math.Exp(-param.Gamma * sum); 216 } 217 case KernelType.SIGMOID: 218 return Math.Tanh(param.Gamma * dot(x, y) + param.Coefficient0); 219 case KernelType.PRECOMPUTED: 220 return x[(int)(y[0].Value)].Value; 221 default: 222 return 0; 223 } 224 } 163 public static double KernelFunction(Node[] x, Node[] y, Parameter param) { 164 switch (param.KernelType) { 165 case KernelType.LINEAR: 166 return dot(x, y); 167 case KernelType.POLY: 168 return powi(param.Degree * dot(x, y) + param.Coefficient0, param.Degree); 169 case KernelType.RBF: { 170 double sum = computeSquaredDistance(x, y); 171 return Math.Exp(-param.Gamma * sum); 172 } 173 case KernelType.SIGMOID: 174 return Math.Tanh(param.Gamma * dot(x, y) + param.Coefficient0); 175 case KernelType.PRECOMPUTED: 176 return x[(int)(y[0].Value)].Value; 177 default: 178 return 0; 179 } 225 180 } 181 } 226 182 }
Note: See TracChangeset
for help on using the changeset viewer.