view tvii/dataset/line.py @ 87:9d5a5e9f5c3b

add kmeans + dataset
author Jeff Hammel <k0scist@gmail.com>
date Sun, 17 Dec 2017 14:05:57 -0800
parents
children
line wrap: on
line source

# -*- coding: utf-8 -*-

"""
generate a line segment
"""

import sys
from .cli import DatasetGenerationParser


def x_range(x_min, x_max, n):
    """1-D range function"""

    dx = (x_max - x_min)/(n - 1.)
    return [x_min + dx*i for i in range(n)]


class Line(object):
    """linear dataset"""

    # TODO: should woprk in `D` dimensions
    def __init__(self, W, b):
        self.W = W
        self.b = b

    def y(self, x):
        return self.W*x + self.b

    def __call__(self, *x):
        return [self.y(_x) for _x in x]


def main(args=sys.argv[1:]):
    """CLI"""

    # parse command line
    parser = DatasetGenerationParser(description=__doc__)
    parser.add_argument('W', type=float,
                        help="slope")
    parser.add_argument('b', type=float,
                        help="offset")
    parser.add_argument('-x', dest='x_range', type=float,
                        nargs=2, metavar=('MIN', 'MAX'), default=(0., 1.),
                        help="range of `x`")
    options = parser.parse_args(args)

    # instantiate line generator
    line = Line(options.W, options.b)

    # generate `x`
    x = x_range(options.x_range[0], options.x_range[1], options.number)

    # generate `y`
    y = line(*x)

    # output points
    parser.writer().writerows(zip(x, y))