public static List <DocumentVector> GetSeedPoints2v(List <DocumentVector> docCollection, int k) { List <DocumentVector> seedPoints = new List <DocumentVector>(k); DocDetails docDetails; List <DocDetails> docDetailsList = new List <DocDetails>(); int index = 0; int firstIndex = KMeansPlus.GenerateRandomNumber(0, docCollection.Count); DocumentVector FirstPoint = docCollection[firstIndex]; seedPoints.Add(FirstPoint); for (int i = 0; i < k - 1; i++) { if (seedPoints.Count >= 2) { DocDetails minpd = GetMinimalPointDistance(docDetailsList); index = GetWeightedProbDist(minpd.Weights, minpd.Sum); DocumentVector SubsequentPoint = docCollection[index]; docDetails = new DocDetails(); docDetails = GetAllDetails(docCollection, SubsequentPoint, docDetails); docDetailsList.Add(docDetails); } else { docDetails = new DocDetails(); docDetails = GetAllDetails(docCollection, FirstPoint, docDetails); docDetailsList.Add(docDetails); index = GetWeightedProbDist(docDetails.Weights, docDetails.Sum); DocumentVector SecondPoint = docCollection[index]; seedPoints.Add(SecondPoint); docDetails = new DocDetails(); docDetails = GetAllDetails(docCollection, SecondPoint, docDetails); docDetailsList.Add(docDetails); } } return(seedPoints); }
private static DocDetails GetAllDetails(List <DocumentVector> docCollection, DocumentVector seedPoint, DocDetails docDetails) { float[] Weights = new float[docCollection.Count]; float minD = float.MaxValue; float Sum = 0; int i = 0; foreach (DocumentVector point in docCollection) { if (point == seedPoint) //Delta is 0 { continue; } Weights[i] = KMeansPlus.GetEucliedeanDistance(point, seedPoint); Sum += Weights[i]; if (Weights[i] < minD) { minD = Weights[i]; } i++; } docDetails.SeedDocVect = seedPoint; docDetails.Weights = Weights; docDetails.Sum = Sum; docDetails.MinD = minD; return(docDetails); }