Clojure — Чтение файлов CSV
Clojure — Линейная регрессия

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

(ns incantertut.core (:use [incanter.charts :only [histogram scatter-plot pie-chart add-points add-lines]] [incanter.core :only [view]] [incanter.stats :only [sample-normal linear-model]]))

Мы собираемся продолжить с того места, на котором остановились, и найти еще несколько интересных свойств линии наилучшего соответствия, таких как значение r в квадрате и другие свойства, такие как остатки. Итак, мы знаем, что линия наилучшего соответствия, которую мы построили из следующих данных…

(def x [1 2 3 4 5]) (def y [5 9 11 20 24]) (linear-model y x) (:fitted (linear-model y x)) ;; => [4.000000000000011 8.900000000000013 13.800000000000015 18.700000000000017 23.60000000000002]

Итак, прежде чем перейти к значению R в квадрате, которое мы получим достаточно скоро. Посмотрим, насколько далеко точки от линии наилучшего соответствия. Для этого incanter предоставил :residuals. Остатки — это расстояние от линии наилучшего соответствия. Это полезная информация, когда вы пытаетесь понять, насколько хорошо наша линия наилучшего соответствия «соответствует» данным.

(:residuals (linear-model y x)) ;; => [0.9999999999999893 0.09999999999998721 -2.800000000000015 1.299999999999983 0.3999999999999808]

Таким образом, остатки хороши, но, возможно, вы просто хотите увидеть абсолютное расстояние и не беспокоиться об отрицательных значениях в остатках. Легко исправить, используя карту, чтобы просто умножить ее на -1, чтобы сделать ее противоположной, вот так…

(map (fn [x] (if (neg? x) (* x -1) x)) (:residuals (linear-model y x))) ;; => (0.9999999999999893 0.09999999999998721 2.800000000000015 1.299999999999983 0.3999999999999808)

Теперь у нас есть все расстояния как положительные, давайте поместим их на график!

(view (add-lines (scatter-plot x y) x (map (fn [x] (if (neg? x) (* x -1) x)) (:residuals (linear-model y x)))))

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

Теперь давайте сделаем что-нибудь еще с остатками. Обычно вы можете возвести остатки в квадрат, что даст вам sse или сумму квадратов из-за ошибки.

(reduce + (map (fn [x] (* x x)) (:residuals (linear-model y x)))) ;; => 10.7

или на самом деле в incanter вы можете просто сделать следующее вместо того, чтобы вводить все это целиком.

(:sse (linear-model y x)) ;; => 10.7

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

(:r-square (linear-model y x)) ;; => 0.9573365231259969

Итак, это наша линия наилучшего соответствия, но насколько хорошо она соответствует нашим данным, именно здесь появляется значение R в квадрате и определяет, насколько хорошо наша линия соответствует нашим данным. Как правило, чем ближе значение R в квадрате к 1, тем лучше. Кроме того, значение R в квадрате колеблется только от 0 до 1. Таким образом, 0,95 довольно хорошо, так что наши данные довольно хорошо соответствуют линии наилучшего соответствия.

Clojure — Чтение файлов CSV Clojure — Линейная регрессия

Первоначально опубликовано на defunsm.github.io.