Beispiel #1
0
        public IVector FindDistances(IReadOnlyList <IVector> data, DistanceMetric distance)
        {
            Debug.Assert(IsValid && data.All(v => v.IsValid));
            if (distance == DistanceMetric.Cosine)
            {
                var norm     = DotProduct(this);
                var dataNorm = data.Select(d => d.DotProduct(d)).ToList();
                var ret      = new float[data.Count];
                for (var i = 0; i < data.Count; i++)
                {
                    ret[i] = Convert.ToSingle(1d - DotProduct(data[i]) / Math.Sqrt(norm * dataNorm[i]));
                }
                return(_cuda.CreateVector(data.Count, i => ret[i]));
            }

            if (distance == DistanceMetric.Euclidean || distance == DistanceMetric.Manhattan)
            {
                var ret = _cuda.CalculateDistances(new[] { this }, data, distance);
                return(ret.ReshapeAsVector());
            }
            else
            {
                var distanceFunc = _GetDistanceFunc(distance);
                var ret          = new float[data.Count];
                for (var i = 0; i < data.Count; i++)
                {
                    ret[i] = distanceFunc(data[i]);
                }
                return(_cuda.CreateVector(data.Count, i => ret[i]));
            }
        }
Beispiel #2
0
        public IVector ColumnL2Norm()
        {
            Debug.Assert(IsValid);
            var norm = new List <float>();

            for (var i = 0; i < ColumnCount; i++)
            {
                using var col = Column(i);
                norm.Add(col.L2Norm());
            }

            return(_cuda.CreateVector(norm.Count, x => norm[x]));
        }