Current section
Files
Jump to
Current section
Files
lib/uci_data_loader.ex
defmodule UCIDataLoader do
defstruct [:data, :target_all_name, :target_names, :length, :amount, :cluster_num, :each_amount]
def load_iris do
iris_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
%HTTPoison.Response{status_code: 200, body: body} = iris_url |> HTTPoison.get!
all_data = body |> to_enum(",")
target_all_name = all_data |> to_target_all_name
target_names = target_all_name |> Enum.uniq |> Enum.filter(&(&1 != ""))
%UCIDataLoader{
data: all_data |> data_to_float(4),
target_all_name: target_all_name,
target_names: target_names,
length: 4,
amount: 150,
cluster_num: target_names |> Enum.count,
each_amount: get_each_amount(target_names,target_all_name),
}
end
def load_wine do
wine_url = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
%HTTPoison.Response{status_code: 200, body: body} = wine_url |> HTTPoison.get!
all_data = Regex.split(~r/\R/, body) |> Enum.slice(1,1600-1) |> Enum.join("\n") |> to_enum(";")
target_all_name = all_data |> to_target_all_name
target_names = target_all_name |> Enum.uniq
%UCIDataLoader{
data: all_data |> data_to_float(11),
target_all_name: target_all_name,
target_names: target_names,
length: 11,
amount: 1600,
cluster_num: 6,
each_amount: get_each_amount(target_names,target_all_name),
}
end
def data_to_float(data, slice_num) do
data
|> Enum.map(&(&1 |> Enum.slice(0,slice_num)))
|> Enum.map(&(&1 |> to_float))
end
def to_enum(body, separator) do
splited = Regex.split(~r"\R", body)
splited
|> Enum.slice(1, (splited |> Enum.count)-3)
splited |> Enum.map(&(&1 |> String.split(separator)))
end
def to_target_all_name(data) do
data
|> Enum.map(&(&1 |> Enum.at(-1)))
end
def sampling_with_replace(datasets, n) do
rands = 1..n |> Enum.map(
fn(_) ->
:rand.uniform(datasets.amount)-1
end)
target_all_name =
rands
|> Enum.map(&(datasets.target_all_name |> Enum.at(&1)))
target_names =
rands
|> Enum.map(&(datasets.target_all_name |> Enum.at(&1)))
|> Enum.uniq
%UCIDataLoader{
data: rands |> Enum.map(&(datasets.data |> Enum.at(&1))),
target_all_name: target_all_name,
target_names: target_names,
length: datasets.length,
amount: n,
each_amount: get_each_amount(target_names,target_all_name),
}
end
defp get_each_amount(target_names, target_all_name) do
target_names
|> Enum.map(
fn(name) ->
target_all_name
|> Enum.filter(&(&1 == name))
|> Enum.count
end
)
end
defp to_float(data) do
data |> Enum.map(&(&1 |> Code.eval_string |> elem(0)))
end
end