Skip to content

Commit

Permalink
linear-r wip
Browse files Browse the repository at this point in the history
  • Loading branch information
danijelkecman committed Aug 13, 2017
1 parent aeb7356 commit 6f8b8ab
Show file tree
Hide file tree
Showing 8 changed files with 532 additions and 79 deletions.
74 changes: 0 additions & 74 deletions Develop.fs

This file was deleted.

77 changes: 77 additions & 0 deletions Modules/knn.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
module knn

open System
open System.IO
open Deedle
open FSharp.Data
open XPlot.GoogleCharts
open XPlot.GoogleCharts.Deedle

type Entry = {Label: string; Values: int list}

// Calculates Squared Euclidean distance between pixels values of two images
let distance (values1: int list, values2: int list) =
values1
|> List.zip values2
|> List.map (fun it -> Math.Pow(float(fst it) - float(snd it), 2.0))
|> List.sum

// Loading valies from training/test data. This assumes that the first one is the
// label/class/category of the data
let loadValues (filename: String) =
File.ReadAllLines(filename)
|> Seq.ofArray
// skip header
|> Seq.skip (1)
|> Seq.map (fun line ->
{
Label = line.Substring(0, line.IndexOf(','));
Values = line.Split(',')
|> Seq.ofArray
// skip label
|> Seq.skip (1)
|> Seq.map (fun n -> Convert.ToInt32(n))
|> Seq.toList
})
|> Seq.toList

let knn (entries: Entry list, newEntry: string * int[], k: int) =
entries |> List.map (fun x -> (x.Label, distance (x.Values, snd (newEntry) |> Array.toList)))
|> List.sortBy (fun x -> snd x)
|> Seq.ofList
|> Seq.take k
|> Seq.countBy (fun x -> fst x)
|> Seq.toList


// location of the csv training file
let loaded = loadValues @"digit-recognizer.csv"

// this entry is '5' from the training set
let newEntry = ("X",[|0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;41;149;156;179;254;254;201;119;46;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;13;147;241;253;253;254;253;253;253;253;245;160;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;31;224;253;253;180;174;175;174;174;174;174;223;247;145;6;0;0;0;0;0;0;0;0;0;0;0;0;7;197;254;253;165;2;0;0;0;0;0;0;12;102;184;16;0;0;0;0;0;0;0;0;0;0;0;0;152;253;254;162;18;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;235;254;158;15;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;74;250;253;15;0;0;0;16;20;19;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;7;199;253;253;0;0;25;130;235;254;247;145;6;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;20;253;253;177;100;219;240;253;253;254;253;253;125;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;5;193;253;253;254;253;253;200;155;155;238;253;229;23;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;61;249;254;241;150;30;0;0;0;215;254;254;58;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;36;39;30;0;0;0;0;0;214;253;234;31;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;41;241;253;183;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;201;253;253;102;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;114;254;253;154;5;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;62;254;255;241;30;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;10;118;235;253;249;103;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;55;81;0;102;211;253;253;253;135;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;79;243;234;254;253;253;216;117;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;48;245;253;254;207;126;27;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0|])
// 5 nearest neigbors
let k = 5
// getting back the labels for each of the neighbors
let labels = knn (loaded, newEntry, k)
// locating the guess. the one with the maximum votes
let guess = fst (labels |> List.item 0)




















49 changes: 49 additions & 0 deletions Modules/linearregression.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
module linearregression

open System
open System.IO
open Deedle
open FSharp.Data
open XPlot.GoogleCharts
open XPlot.GoogleCharts.Deedle
open MathNet.Numerics.LinearAlgebra
open MathNet.Numerics.LinearRegression
open MathNet.Numerics.Fit

let rows = File.ReadAllLines(@"auto-mpg.csv")
|> Array.map (fun t -> t.Split(',')
|> Array.map (fun t -> float t))
let mpgData = DenseMatrix.ofRowArrays rows

let myMat = matrix [[1.0;2.0;3.0]
[4.0;5.0;2.0]
[7.0;0.8;9.0]]

let qr = myMat.QR()

let x = [14;16;27;42;39;50;83]
let y = [02;05;07;09;10;13;20]
let y' = [3;4;5;7;23;21;34]

let calculateCoefficients x y =
let xy = List.zip x y
|> List.map (fun it -> float (fst it) * float (snd it))
|> List.sum
let x_ = x |> List.map (fun z -> float z)
|> List.average
let y_ = y |> List.map (fun z -> float z)
|> List.average
let sx_2 = x |> List.sumBy (fun t -> float t * float t)
let sy_2 = y |> List.sumBy (fun t -> float t * float t)
let n = float x.Length
let b1 = (xy - n * x_ * y_)/(sx_2 - n * x_ * x_)
let b0 = y_ - b1 * x_
(b0, b1)

let coef = calculateCoefficients x y
let b0 = fst coef
let b1 = snd coef

let regressionPairs = x |> List.map ( fun xElem -> (xElem, b0 + b1* float xElem ))

let pairs = List.zip x y
File renamed without changes.
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# fslab-ml
Some old ML code in F# in Mac Environment

\pi

# Euclidean distance
**Euclidean distance**
d^2(p,q) = (p1-q1)^2+(p2-q2)^2+...+(pi-qi)^2+...+(pn-qn)^2

**Entropy**
H(X) = sum(P(xi)*I(xi)) = -sum(P(xi) * logb * p(xi))

Loading

0 comments on commit 6f8b8ab

Please sign in to comment.