Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Własność Kamila Kubicy wszelkie prawa zastrzeżone, wzory są zapewne te same więc korzystajcie z tego wszyscy :)
- using System;
- using System.Collections;
- using System.Linq;
- using System.Xml.XPath;
- namespace VectorDistanceMeasures
- {
- class Program
- {
- static void Main(string[] args)
- {
- var v1 = new float[] { 13, 22, 43, 54, 25, 46, 17 };
- var v2 = new float[] { 6, 16, 21, 54, 33, 20, 17 };
- var w = new float[] { 1, 2, 3, 4, 5, 6, 7 };
- var vb1 = new int[] {1, 0, 1, 1, 0, 0, 1, 1, 0};
- var vb2 = new int[] {0, 1, 0, 1, 1, 0, 0, 1, 1};
- var vs1 = new string[] {"Kamil","Ala","Domek","Samochod","Kolo","Okno","Drzwi"};
- var vs2 = new string[] { "Ala", "Kamil", "Kolo", "Samochod", "Drzwi", "Alina", "Fotel" };
- WriteLineVector(v1);
- WriteLineVector(v2);
- Console.WriteLine($"Dystans Minkowski: {DistanceForNumericAtributes(v1,v2)}");
- Console.WriteLine($"Dystans Minkowski z wagami: {DistanceForNumericAtributesWithWages(v1, v2,w)}");
- Console.WriteLine();
- WriteLineVector(vb1);
- WriteLineVector(vb2);
- Console.WriteLine($"Dystans Binarny: {DistanceForBinaresAttributes(vb1, vb2)}");
- Console.WriteLine($"DystansJaccard: {DistanceForBinaresAttributesJaccard(vb1, vb2)}");
- Console.WriteLine();
- WriteLineVector(vs1);
- WriteLineVector(vs2);
- Console.WriteLine($"Dystans Nominalny kolejność: {DistanceForNominalAttributes(vs1, vs2)}");
- Console.WriteLine($"Dystans Nominaly zawartosć: {DistanceForNominalAttributesContains(vs1,vs2)}");
- Console.WriteLine();
- }
- private static void WriteLineVector(IEnumerable vector)
- {
- Console.Write("[");
- foreach (var item in vector)
- {
- Console.Write($" {item}");
- }
- Console.WriteLine("] ");
- }
- private static double DistanceForNumericAtributes(float [] xi,float [] xj)
- {
- double d = 0;
- var g = xi.Length;
- for (int i = 0; i < g; i++)
- {
- d += Math.Pow(Math.Abs(xi[i]-xj[i]),g);
- }
- return Math.Pow(d, 1.0/g);
- }
- private static double DistanceForNumericAtributesWithWages(float[] xi, float[] xj,float [] wp)
- {
- double d = 0;
- var g = xi.Length;
- for (int i = 0; i < g; i++)
- {
- d += wp[i]*Math.Pow(Math.Abs(xi[i] - xj[i]), g);
- }
- return Math.Pow(d, 1.0 / g);
- }
- private static double DistanceForBinaresAttributes(int[] xi, int[] xj)
- {
- var noEqual = 0;
- var q = 0;
- var t = 0;
- var n= xi.Length;
- for (int i = 0; i < n; i++)
- {
- if (xi[i]==0&&xj[i]==0)
- {
- t++;
- }
- if (xi[i] == 1 && xj[i] == 1)
- {
- q++;
- }
- else
- {
- noEqual++; //r+s
- }
- }
- return (1.0*noEqual/(noEqual+q+t));
- }
- private static double DistanceForBinaresAttributesJaccard(int[] xi, int[] xj)
- {
- var noEqual = 0;
- var q = 0;
- var n = xi.Length;
- for (int i = 0; i < n; i++)
- {
- if (xi[i] == 1 && xj[i] == 1)
- {
- q++;
- }
- else
- {
- noEqual++; //r+s
- }
- }
- return (1.0*noEqual / (noEqual + q));
- }
- private static double DistanceForNominalAttributes(string[] xi, string[] xj)
- {
- var p = xi.Length;
- var m = 0;
- for (int i = 0; i < p; i++)
- {
- if (xi[i] == xj[i])
- {
- m++;
- }
- }
- return (1.0*(p-m)/p);
- }
- private static double DistanceForNominalAttributesContains(string[] xi, string[] xj)
- {
- var p = xi.Length;
- var m = 0;
- for (int i = 0; i < p; i++)
- {
- if ( xj.Contains(xi[i]))
- {
- m++;
- }
- }
- return (1.0*(p - m) / p);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement