public override bool Equals(object obj) { Model test = obj as Model; if (test == null) { return(false); } bool same = ClassLabels.IsEqual(test.ClassLabels); same = same && NumberOfClasses == test.NumberOfClasses; same = same && NumberOfSVPerClass.IsEqual(test.NumberOfSVPerClass); if (PairwiseProbabilityA != null) { same = same && PairwiseProbabilityA.IsEqual(test.PairwiseProbabilityA); } if (PairwiseProbabilityB != null) { same = same && PairwiseProbabilityB.IsEqual(test.PairwiseProbabilityB); } same = same && Parameter.Equals(test.Parameter); same = same && Rho.IsEqual(test.Rho); same = same && SupportVectorCoefficients.IsEqual(test.SupportVectorCoefficients); same = same && SupportVectorCount == test.SupportVectorCount; same = same && SupportVectors.IsEqual(test.SupportVectors); return(same); }
public override void Algorithm() { SupportVectors.Clear(); SupportVectors.Capacity = 0; // Save support vectors indexes for (int i = 0; i < Solver.lagrangians.Length; ++i) { if (Solver.lagrangians[i] > 0) { SupportVectors.Add(i); } } foreach (var i in SupportVectors) { foreach (var j in SupportVectors) { Lambda += Labels[i] * Labels[j] * Solver.lagrangians[i] * Solver.lagrangians[j] * KernelMatrix[i, j]; } } int chosen = SupportVectors.FirstOrDefault(); B = Labels[chosen] * Lambda; foreach (var i in SupportVectors) { B -= Solver.lagrangians[i] * Labels[i] * KernelMatrix[chosen, i]; } Margin = Math.Sqrt(Lambda); }
/// <summary> /// Creates a new object that is a copy of the current instance. /// </summary> /// <returns> /// A new object that is a copy of this instance. /// </returns> public override object Clone() { var clone = new SupportVectorMachine <TKernel>(NumberOfInputs, Kernel); clone.SupportVectors = SupportVectors.MemberwiseClone(); clone.Weights = (double[])Weights.Clone(); clone.IsProbabilistic = IsProbabilistic; clone.Threshold = Threshold; return(clone); }
/// <summary> /// Creates a new object that is a copy of the current instance. /// </summary> /// <returns> /// A new object that is a copy of this instance. /// </returns> public virtual object Clone() { var clone = new SupportVectorMachine <TKernel, TInput>(NumberOfInputs, Kernel); clone.SupportVectors = (TInput[])SupportVectors.Clone(); clone.Weights = (double[])Weights.Clone(); clone.IsProbabilistic = IsProbabilistic; clone.Threshold = Threshold; return(clone); }
public override int GetHashCode() { return(ClassLabels.ComputeHashcode() + NumberOfClasses.GetHashCode() + NumberOfSVPerClass.ComputeHashcode() + PairwiseProbabilityA.ComputeHashcode() + PairwiseProbabilityB.ComputeHashcode() + Parameter.GetHashCode() + Rho.ComputeHashcode() + SupportVectorCoefficients.ComputeHashcode() + SupportVectorCount.GetHashCode() + SupportVectors.ComputeHashcode()); }
public override void Algorithm() { SupportVectors.Clear(); SupportVectors.Capacity = 0; // Save support vectors indexes for (int i = 0; i < Solver.lagrangians.Length; ++i) { if (Solver.lagrangians[i] > 0) { SupportVectors.Add(i); } } int indexi = -1, indexj = -1; foreach (var i in SupportVectors) { if ((-1.0) / (Nu * Values.Length) < Solver.lagrangians[i] * Labels[i] && Solver.lagrangians[i] * Labels[i] < 0) { indexi = i; } if (0 < Solver.lagrangians[i] * Labels[i] && Solver.lagrangians[i] * Labels[i] < 1.0 / (Nu * Values.Length)) { indexj = i; } foreach (var j in SupportVectors) { Lambda += Labels[i] * Labels[j] * Solver.lagrangians[i] * Solver.lagrangians[j] * KernelMatrix[i, j]; } } Lambda = Math.Sqrt(Lambda) / 2.0; double left = 0, right = 0; foreach (var k in SupportVectors) { left += Solver.lagrangians[k] * Labels[k] * KernelMatrix[k, indexi]; right += Solver.lagrangians[k] * Labels[k] * KernelMatrix[k, indexj]; } B = -Lambda * (left + right); Margin = 2 * Lambda * right + B; }