代码拉取完成,页面将自动刷新
package embeddings
import (
"errors"
"math"
)
var (
// ErrVectorsNotSameSize is returned if the vectors returned from the
// embeddings api have different sizes.
ErrVectorsNotSameSize = errors.New("vectors gotten not the same size")
// ErrAllTextsLenZero is returned if all texts to be embedded has the combined
// length of zero.
ErrAllTextsLenZero = errors.New("all texts have length 0")
)
func CombineVectors(vectors [][]float64, weights []int) ([]float64, error) {
average, err := getAverage(vectors, weights)
if err != nil {
return nil, err
}
averageNorm := getNorm(average)
for i := 0; i < len(average); i++ {
average[i] /= averageNorm
}
return average, nil
}
// getAverage does the following calculation:
//
// avg = sum(vectors * weights) / sum(weights).
func getAverage(vectors [][]float64, weights []int) ([]float64, error) {
// Check that all vectors are the same size and get that size.
vectorLen := -1
for _, vector := range vectors {
if vectorLen == -1 {
vectorLen = len(vector)
continue
}
if len(vector) != vectorLen {
return nil, ErrVectorsNotSameSize
}
}
if vectorLen == -1 {
return []float64{}, nil
}
// Get the sum of the weights.
weightSum := 0
for _, weight := range weights {
weightSum += weight
}
if weightSum == 0 {
return nil, ErrAllTextsLenZero
}
average := make([]float64, vectorLen)
for i := 0; i < vectorLen; i++ {
for j := 0; j < len(vectors); j++ {
average[i] += vectors[j][i] * float64(weights[j])
}
}
for i := 0; i < len(average); i++ {
average[i] /= float64(weightSum)
}
return average, nil
}
func getNorm(v []float64) float64 {
var sum float64
for i := 0; i < len(v); i++ {
sum += v[i] * v[i]
}
return math.Sqrt(sum)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。