Лабораторная работа 9: косинусный коэффициент

Кувшинов Д.Р.

2017


Общее оглавление


Задание 1

Косинусный коэффициент cosine similarity — мера подобия между двумя массивами данных, вычисляемая как косинус угла между векторами в многомерном пространстве.

Косинус угла между векторами a и b
Косинус угла между векторами a и b

Если a или b — нулевой вектор, то положим cos(a, b) = 0.


Требуется написать программу, считывающую значения двух векторов из двух файлов и выводящую на экран значение косинусного коэффициента.

Пример вычисления. Дано

a = { 1, 5, 10, 0, 0, 2, 4 };
b = { 5, 2, 2, 10, 2, 5, 0 };

Тогда cos(a, b) = 0.292603 (угол 73°).


Пример кода: чтение вектора чисел (результат функции) из файла с заданным именем (параметр функции).

#include <vector>
#include <string>
#include <fstream>

std::vector<double> dv_read(const std::string &file_name)
{
  std::vector<double> result;
  std::ifstream file(file_name);
  for (double val; file >> val;)
    result.push_back(val);
  return result;
}

Рекомендация: написать сначала функцию, принимающую два вектора и возвращающую их скалярное произведение.


Задание 2

Добавить в алгоритм вычисления косинусного коэффициента предварительную обработку данных:

  1. Вычислить среднее арифметическое вектора и вычесть его из всех элементов (“центрировать”).
  2. Вычислить максимум модуля значений вектора и разделить на него все элементы (“нормировать”). Если этот максимум равен нулю (т.е. вектор нулевой), то оставить вектор нулевым.

Пример вычисления. Дано

a = { 1, 5, 10, 0, 0, 2, 4 };
b = { 5, 2, 2, 10, 2, 5, 0 };

После центрирования:

a == { -2.14286,  1.85714,  6.85714, -3.14286, -3.14286, -1.14286,  0.857143 };
b == {  1.28571, -1.71429, -1.71429,  6.28571, -1.71429,  1.28571, -3.71429 };

После нормирования:

a == { -0.3125,    0.270833,         1, -0.458333, -0.458333, -0.166667,  0.125 };
b == {  0.204545, -0.272727, -0.272727,         1, -0.272727,  0.204545, -0.590909 };

После центрирования и нормирования cos(a, b) = -0.517737 (угол 121°).


Общее оглавление

Кувшинов Д.Р. © 2017