Giter Club home page Giter Club logo

piecewise_linear_fit_py's Introduction

About

A library for fitting continuous piecewise linear functions to data. Just specify the number of line segments you desire and provide the data.

Downloads a month pwlf ci codecov PyPI version Conda

Check out the documentation!

Read the blog post.

Example of a continuous piecewise linear fit to data.

Example of a continuous piecewise linear fit to a sine wave.

Now you can perform segmented constant fitting and piecewise polynomials! Example of multiple degree fits to a sine wave.

Features

For a specified number of line segments, you can determine (and predict from) the optimal continuous piecewise linear function f(x). See this example.

You can fit and predict a continuous piecewise linear function f(x) if you know the specific x locations where the line segments terminate. See this example.

If you want to pass different keywords for the SciPy differential evolution algorithm see this example.

You can use a different optimization algorithm to find the optimal location for line segments by using the objective function that minimizes the sum of square of residuals. See this example.

Instead of using differential evolution, you can now use a multi-start gradient optimization with fitfast() function. You can specify the number of starting points to use. The default is 2. This means that a latin hyper cube sampling (space filling DOE) of 2 is used to run 2 L-BFGS-B optimizations. See this example which runs fit() function, then runs the fitfast() to compare the runtime differences!

Installation

Python Package Index (PyPI)

You can now install with pip.

python -m pip install pwlf

Conda

If you have conda, you can also install from conda-forge.

conda install -c conda-forge pwlf

From source

Or clone the repo

git clone https://github.com/cjekel/piecewise_linear_fit_py.git

then install with pip

python -m pip install ./piecewise_linear_fit_py

How it works

This paper explains how this library works in detail.

This is based on a formulation of a piecewise linear least squares fit, where the user must specify the location of break points. See this post which goes through the derivation of a least squares regression problem if the break point locations are known. Alternatively check out Golovchenko (2004).

Global optimization is used to find the best location for the user defined number of line segments. I specifically use the differential evolution algorithm in SciPy. I default the differential evolution algorithm to be aggressive, and it is probably overkill for your problem. So feel free to pass your own differential evolution keywords to the library. See this example.

Changelog

All changes now stored in CHANGELOG.md

New weights= keyword allows you to perform weighted pwlf fits! Removed TensorFlow code which can now be found here.

Requirements

Python 2.7+

NumPy >= 1.14.0

SciPy >= 1.2.0

pyDOE >= 0.3.8

License

MIT License

Citation

@Manual{pwlf,
author = {Jekel, Charles F. and Venter, Gerhard},
title = {{pwlf:} A Python Library for Fitting 1D Continuous Piecewise Linear Functions},
year = {2019},
url = {https://github.com/cjekel/piecewise_linear_fit_py}
}

piecewise_linear_fit_py's People

Contributors

bezineb5 avatar cjekel avatar h-vetinari avatar tcanders avatar vkhodygo avatar xhain avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

piecewise_linear_fit_py's Issues

TensorFlow port

Needed:

  • assemble_regression_matrix
  • fit_with_breaks
  • fit_with_breaks_force_points
  • predict
  • fit_with_breaks_opt
  • fit_force_points_opt
  • standard_errors
  • prediction_variance
  • r_squared
  • fit
  • fitfast
  • fit_guess
  • use_custom_opt

Probably won't change:

  • calc_slopes
  • p_values

Add errors/warnings:
- [ ] small number of data
- [ ] square matrix
I added try except catches to the optimization functions that would result in either a failed Cholesky decomposition or non-invertible matrix.

How to get polynomials coefficients?

Hi,

Is there a way to get the polynomial coefficients in a similar way it was provided in numpy.polyfit?

I did the following as a simple example to illustrate what I was thinking:

import numpy as np
import matplotlib.pyplot as plt
import pwlf

# create the data
x = np.arange(10)
y = np.zeros(10)
y[:5] = 0 + 2 * x[:5]
y[5:] = 20 - 3 * x[5:]

degree = 1
segments = 2

my_pwlf = pwlf.PiecewiseLinFit(x, y, degree=degree, disp_res=True)
res = my_pwlf.fit(segments)

# predict
xHat = np.linspace(min(x), max(x), num=10000)
yHat = my_pwlf.predict(xHat)

# get polynomial coefficients
def get_coeffs(pwlf) -> np.ndarray:
    coefficients = np.array(list(zip(pwlf.slopes, pwlf.intercepts)))
    return coefficients

coeffs = get_coeffs(my_pwlf)
p1 = np.poly1d(coeffs[0])
p2 = np.poly1d(coeffs[1])

breaks = my_pwlf.fit_breaks[1]

# test polynomial
ytest = np.zeros(len(x))
for i in range(len(x)):
    if x[i] <= breaks:
        ytest[i] = p1(x[i])
    else:
        ytest[i] = p2(x[i])

plt.figure()
plt.plot(x, y, 'o', label='data')
plt.plot(xHat, yHat, '-', label='predict')
plt.plot(x, ytest, '--', label='fit test')
plt.legend()
plt.show()

Thank you

Add Constraint

Add an option to constraint linear coefficients to a range of values (e.g >0 ).

p-value

Hey cjekel,

Thanks a lot for your work.
Is there a way I can retrieve the p-values of the coefficients of piecewise regression?
Thank you.

Can pwlf predict on multidimensional input?

I found this document gives demos which predict on a one-dimension input array x. According to your comments, I find that this model seems only supports 1-d input array

        x : array_like
            The x or independent data point locations as list or 1 dimensional
            numpy array.

I just wondering if pwlf can predict on multidimensional input such as the following, and I provide something like a fit_breaks list, which tells pwlf to break on certain values of clock? Moreover, if I want to remove the clock feature afterwards, is it possible?

clock    feat1    feat2
0            1           2
100        3           4

Missing offsets

You have a function to calculate slopes, but not offsets.

y_hat = self.predict(self.fit_breaks[0:-1])
self.offsets = y_hat - self.slopes*self.fit_breaks[0:-1]

How to use the standard erros

Hi,

First of all, thanks for a great software. I'm however struggling somewhat with the standard errors. I would like to plot both the data, a piece wise linear fit and a 95 % confidence interval for the fit, but I'm not quite sure how to actually do this. Could you for instance update the fitForSpecifiedNumberOfLineSegments.py example to also plot the 95% confidence interval?

What I have been trying is
se = pwlf_Fz_dy.standard_errors()

fz_soil_xHat_95 = pwlf_Fzdy_soil.predict(brkpoints_y) + se * 1.96
fz_soil_xHat_05 = pwlf_Fzdy_soil.predict(brkpoints_y) - se * 1.96
some plotting function here

but I'm not sure if this is the correct approach.

Best regards
Torstein Skår

Time Complexity Analysis

I just read the paper for this project and it looks amazing and has given me great insight to piece-wise algorithms. I think that it would be amazing if you could include a section to your paper looking at the time complexity of your algorithm.

After running your program against my rather large data set It finds an answer relatively fast for a small number of breaks; but, takes a very long time when it tries to look for more than 5 break points.

What are your thoughts? I would love to help out in any way that I can.

Proposal: non-array arguments to PiecewiseLinFit.predict()

Calling predict() with a float type argument raises IndexError (vs TypeError).

       if sorted_data is False:
           # sort the data from least x to max x
           order_arg = np.argsort(x)
           x = x[order_arg]  <<--- HERE

Consider detecting non-array arguments to predict?

write paper describing all mathematical methods used in library

This Library has grown significantly since it's inception. I've included statistical features that have not been formally written (standard errors and prediction variance).

Before I fall behind, I need to write a paper describing all of the features and use cases of this library. This will need to describe the underlining mathematics and statistics the library follows.

Error when using two line fitting

Hi,
Thanks for your work, this package is exactly what I've been looking for!

However, I have some issues. My data has a few different regions, however, I'm not sure how many: two or three. So, I tried both, and with three different fits your package works perfect, whereas when I try to fit my data with two straight lines, I get this error:

>>> res = myPWLF.fit(2)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>


File "/home/user/.local/lib/python3.6/site-packages/pwlf/pwlf.py", line 308, in fit
  polish=True, init='latinhypercube', atol=1e-4)

File "/home/user/.local/lib/python3.6/site-packages/scipy/optimize/_differentialevolution.py", line 213, in differential_evolution

  return solver.solve()

File "/home/user/.local/lib/python3.6/site-packages/scipy/optimize/_differentialevolution.py", line 511, in solve

  self._calculate_population_energies()

File "/home/user/.local/lib/python3.6/site-packages/scipy/optimize/_differentialevolution.py", line 590, in _calculate_population_energies
  *self.args)

File "/home/user/.local/lib/python3.6/site-packages/pwlf/pwlf.py", line 226, in fitWithBreaksOpt
  if np.isclose(var[0],var[1]) == True:
IndexError: index 1 is out of bounds for axis 0 with size 1```

Could you please clarify this moment?
Sincerely, V.

add Rsqaured value

I should either calculated the R^2 value for each fit, or create a function that returns the R^2 value for a given fit.

The R^2 example is given here:
c25e5b3

Suggestion: batch data processing

I have a particular problem that requires a piece-wise approximation of similar datasets.
My current solution is to process the data one by one,
next I extract the slopes, find the average and the standard deviation.
However, I found someone having a similar issue and the offered solution is to "fit a multilevel model".
Is it possible to implement this feature somehow?

prediction_variance throw "LinAlgError: Singular matrix" too often

When I use this method https://github.com/cjekel/piecewise_linear_fit_py/blob/master/pwlf/pwlf.py#L1240 it provides the
"LinAlgError: Singular matrix" too often.
When debugging, I see that the Ad matrix calculated in here:
https://github.com/cjekel/piecewise_linear_fit_py/blob/master/pwlf/pwlf.py#L1304
has the last column is all 0, such as:
(Pdb) p Ad
array([[ 1., 2., 0.],
[ 1., 4., 0.],
[ 1., 6., 0.],
[ 1., 7., 0.],
[ 1., 8., 0.],
[ 1., 9., 0.],
[ 1., 11., 0.],
[ 1., 12., 0.],
[ 1., 16., 0.],
[ 1., 18., 0.],
[ 1., 19., 0.],
[ 1., 20., 0.],
[ 1., 21., 0.],
[ 1., 22., 0.],
[ 1., 23., 0.]])
so:
(Pdb) np.dot(Ad.T, Ad)
array([[ 15., 198., 0.],
[ 198., 3310., 0.],
[ 0., 0., 0.]])
and then https://github.com/cjekel/piecewise_linear_fit_py/blob/master/pwlf/pwlf.py#L1323
will throw the error.
Have you consider using pinv instead of inv here, which still provides a good pseudo inverse matrix to use later?
(Pdb) linalg.pinv(np.dot(Ad.T, Ad))
array([[ 0.3168677 , -0.01895462, 0. ],
[-0.01895462, 0.00143596, 0. ],
[ 0. , 0. , 0. ]])
I can make a PR if you see it helpful

How to constraint to integers breaks only

Hi again,

in my application it would perform better if it has the ability to constraint the breaks into integers only.

To explain this situation, my application is a piecewise 3rd polynomial degree linearization for some electronic sensors, so I use the coefficients of the polynomial into values given by an ADC (analog-to-digital converter) of 10 bits, which gives-me unsigned integers values from 0 to 1023, so right now I am breaking the linear pieces flooring it (rounding down) and it potentially gives-me some error there.

Any suggestion on how to achieve that?

Model dumping

Hi Charles,
this is an awesome lib. But as it seems there is no possibility to dump the learned linear spline model to a file. This would make it quite more applicable to practical use cases....are there any plans to support this feature?

fix documentation?

I have no idea what's going on with documentation and why it wasn't building...

Number of Line Segments Needs to Be Specified

It looks like this library requires a user to specify the number of line segments before fitting a model. This means this library can't be used for automatic trend detection(this requires a program to figure out the right number of line segments itself)? It is not quite useful if it requires a user to visually inspect the chart to figure out how many line segments are.

Cannot run basic example - "only integer scalar arrays can be converted to a scalar index"

Hi there,

When running the following code:
my_pwlf = pwlf.PiecewiseLinFit(x, y)
res = my_pwlf.fit(4)
xHat = np.linspace(min(x), max(x), num=10000)
yHat = my_pwlf.predict(xHat)

I get the error:
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pwlf/pwlf.py", line 55, in __init__ self.x_data = x[order_arg]
TypeError: only integer scalar arrays can be converted to a scalar index

I have managed to work out what was causing this error but I will post this anyway in case others run into the same issue. The x and y array fed into the PiecewiseLinFit function has to be an np.array type.

To fix, I just changed the code to:
my_pwlf = pwlf.PiecewiseLinFit(np.array(x), np.array(y))

TypeError: scipy/linalg/interface.py

I'm getting an error if I use the fit function for the standard example. I'm using Python3.6 and scipy version 1.1.0.

my_pwlf = pwlf.PiecewiseLinFit(x, y)
res = my_pwlf.fit(2)

The error message is:
`
File "/home/svimal/miniconda3/lib/python3.6/site-packages/scipy/optimize/lbfgsb.py", line 378, in _minimize_lbfgsb
hess_inv = LbfgsInvHessProduct(s[:n_corrs], y[:n_corrs])
File "/home/svimal/miniconda3/lib/python3.6/site-packages/scipy/sparse/linalg/interface.py", line 144, in new
obj = super(LinearOperator, cls).new(cls)

TypeError: super(type, obj): obj must be an instance or subtype of type`

multivariate pwlf?

Does this code support multivariate piecewise linear regression?
Or is there any plan to support this?

Feature request: remove output messages, restricted result range

Hi again!

Sorry for disturbing, but I would like to ask you a few more things.
First, is it possible to add a key parameter which turns off all the output messages (except errors)?
I have to deal with massive numbers of files and I need to see my own print messages.

Second, can your algorithm in general use boundaries for resulting parameters? Say, I know in general, that the values of slopes a priori lie in range [0:2], thus, the result has to be in the range.

Sincerely,
V.

Incorrect Prediction

I've noticed that for small data sets, sometimes the predict function gives a result that appears to have the incorrect number of segments, even though .n_segments, .slopes, .fit_breaks, all seem to indicate the correct number of segments.

Here is an example which seems to give consistently the incorrect results

import numpy as np
import matplotlib.pyplot as plt
import pwlf

numSegRequest = 2

x = np.array([0.11445023, 0.49628489, 0.67287169, 0.83479312, 0.90068457,
       1.15980533, 1.34981648, 1.52888812, 1.70987057, 1.73051513])
y = np.array([ 0.0732206 ,  0.11161097,  0.01289929, -0.02448141, -0.17952348,
       -0.33457269, -0.48479134, -0.83837053, -1.41280894, -1.45807414])

my_pwlf = pwlf.PiecewiseLinFit(x,y)
res = my_pwlf.fit(numSegRequest)

plt.plot(x,y,'o')
plt.plot(x,my_pwlf.predict(x))
plt.title('number of segments: '+str(my_pwlf.n_segments))
plt.show()

print('breaks: ',my_pwlf.fit_breaks)

Which has the following results

image
breaks: [0.11445023 1.29188065 1.73051513]

forcing fits through points with degrees > 1

Hi, I am trying to force a fit through a point using the pwlf library. If I force the fit through a certain data point with a degree=1 everything works perfectly, but as soon as I set the degree=2 the following error comes up:

ValueError: could not broadcast input array from shape (5,1) into shape (11,1)

This is the code I used:

import numpy as np
import pwlf


#generate sin wave data
x = np.linspace(0, 10, num=100)
y = np.sin(x * np.pi / 2)
# add noise to the data
y = np.random.normal(0, 0.15, 100) + y

#linear fit
my_pwlf_1 = pwlf.PiecewiseLinFit(x, y, degree=1)
my_pwlf_1.fit(n_segments=6, x_c = [0], y_c = [0])
y_predict_1 = my_pwlf_1.predict(x)

# quadratic fit
my_pwlf_2 = pwlf.PiecewiseLinFit(x, y, degree=2)
my_pwlf_2.fit(n_segments=5, x_c = [0], y_c = [0])
y_predict_2 = my_pwlf_2.predict(x)

update paper

I've made a number of changes since the 1.0.0 release that make the current library significantly different than the March 19, 2019 paper.

Problem in seperateData when the breaks are spot on dataX

Hi,

Great lib !

I think I have spotted an issue with it however. It seems that when the breaks are spot on the xdata the break point belongs at the same time in two arrays of sepData. Thus it increases the size of yHat in fitWithBreaks and an error is raised when the function calculate the sum of the square of residuals
e = self.yData-yHat

My guess would be to change either the bTest or aTest in separateData to a strict inequality.

I am not sure I am being very clear, my english is a little bit rusty.

Have a nice day,

Small problem in documentation

Hey @cjekel ,

thank you for this library! It's been a great help in prototyping some ideas this week.
I found a slight mismatch in the documentation:

PieceWiseLinFit.fitfast and PieceWiseLinFit.fit_guess mention that scipy.optimize.differential_evolution is used, but that's not true. It's only called for PieceWiseLinFit.fit.

PieceWiseLinFit.fitfast and PieceWiseLinFit.fit_guess both use scipy.optimize.fmin_l_bfgs_b instead.

It's correct further down in the documentation (near the examples) though.

See:

Directly passed into scipy.optimize.differential_evolution(). This

Directly passed into scipy.optimize.differential_evolution(). This

AttributeError: 'PiecewiseLinFit' object has no attribute 'beta'

Hi, thanks for the package!

When trying to run the examples here https://jekel.me/piecewise_linear_fit_py/examples.html, I am consistently running into the error AttributeError: 'PiecewiseLinFit' object has no attribute 'beta'. For example, following the 'fit for specified number of line segments' example, I get:

    yHat = my_pwlf.predict(xHat)
  File "/Users/tom/phd/entity_extraction/piecewise_linear_fit_py/pwlf/pwlf.py", line 609, in predict
    y_hat = np.dot(A, self.beta)
AttributeError: 'PiecewiseLinFit' object has no attribute 'beta'

I am using Python 3.5.6. I tried both pip install pwlf and installing from source and got the same issue. Let me know if you need any more info. Thanks!

when use pwlf, I encounter errors: TypeError: must be real number, not NoneType

when use pwlf, I encounter errors: TypeError: must be real number, not NoneType
Below is my code:
x = np.random.rand(100,1)
y = np.random.rand(100,1)
myPWLF = pwlf.PiecewiseLinFit(x.reshape(-1), y.reshape(-1))
myPWLF.fit(6)
But when I changed another PC, this problem disappears. So I think it may be due to some depend library.

Traceback (most recent call last):
File "test.py", line 69, in
y_plf, x_plf = model_tm.plf(zkOrder_start, zkOrder_end, y_total, z_fit)
File "/media/disk2/sgcc_model_tm2/Model/model_tm.py", line 129, in plf
myPWLF.fit(z_fit)
File "/home/lukuan/.pyenv/versions/anaconda3-5.1.0/envs/lk3/lib/python3.6/site-packages/pwlf/pwlf.py", line 971, in fit
atol=1e-4)
File "/home/lukuan/.pyenv/versions/anaconda3-5.1.0/envs/lk3/lib/python3.6/site-packages/scipy/optimize/_differentialevolution.py", line 213, in differential_evolution
return solver.solve()
File "/home/lukuan/.pyenv/versions/anaconda3-5.1.0/envs/lk3/lib/python3.6/site-packages/scipy/optimize/_differentialevolution.py", line 511, in solve
self._calculate_population_energies()
File "/home/lukuan/.pyenv/versions/anaconda3-5.1.0/envs/lk3/lib/python3.6/site-packages/scipy/optimize/_differentialevolution.py", line 590, in _calculate_population_energies
*self.args)
File "/home/lukuan/.pyenv/versions/anaconda3-5.1.0/envs/lk3/lib/python3.6/site-packages/pwlf/pwlf.py", line 670, in fit_with_breaks_opt
beta, ssr, rank, s = np.linalg.lstsq(A, self.y_data, rcond=None)
File "/home/lukuan/.pyenv/versions/anaconda3-5.1.0/envs/lk3/lib/python3.6/site-packages/numpy/linalg/linalg.py", line 1953, in lstsq
0, work, -1, iwork, 0)
TypeError: must be real number, not NoneType

Thank you!

if y=x, then it takes ages to train

If independent variable x and dependent variable y=f(x) is the same, in other words, y=f(x)=x.
Then the training process takes ages to train...

differential_evolution step 1: f(x)= 2.08676e-23
differential_evolution step 2: f(x)= 2.08676e-23
differential_evolution step 3: f(x)= 2.08676e-23
differential_evolution step 4: f(x)= 2.08103e-23
differential_evolution step 5: f(x)= 2.08103e-23
.....
.....
.....
differential_evolution step 990: f(x)= 2.02263e-25
differential_evolution step 991: f(x)= 2.02263e-25
differential_evolution step 992: f(x)= 2.02263e-25
differential_evolution step 993: f(x)= 2.02263e-25
differential_evolution step 994: f(x)= 2.02263e-25
differential_evolution step 995: f(x)= 2.02263e-25
differential_evolution step 996: f(x)= 2.02263e-25
differential_evolution step 997: f(x)= 2.02263e-25
differential_evolution step 998: f(x)= 2.02263e-25

So such circumstances should be avoided?

Can not run fitForSpecifiedNumberOfLineSegments.py

Hi,
I got some problems to run your fitForSpecifiedNumberOfLineSegments.py. I get the following error message:

unbenannt

Can you help me, please?
My numpy version is 1.13.3 and scipy version is 1.0.0.

Sincerely,
s.

Implement not-so rudimentary support of version string

Hi

I am using pwlf within https://github.com/pyinstaller/pyinstaller (it compiles python to exe on windows).

However, pwlf is causing some troubles, because version handling is too simple - the file "https://github.com/cjekel/piecewise_linear_fit_py/blob/master/pwlf/VERSION" is not included automatically in the build, and I have to create it every time. Otherwise, it is failing:

VERSION_FILE = os.path.join(os.path.dirname(__file__), 'VERSION')
__version__ = open(VERSION_FILE).read().strip()

For now I'm going to generate empty VERSION file by script, however it is not a solution.

I suggest to use the approach numpy guys use:
They generate version.py file by setup.py:
https://github.com/numpy/numpy/blob/96abdedcb21df7e1a07a7e73a5f2103895a36faf/setup.py#L127

and then import it as __version__:
https://github.com/numpy/numpy/blob/b7c27bd2a3817f59c84b004b87bba5db57d9a9b0/numpy/__init__.py#L132

Can not open https with selenium

Hi,
I have got some problems to open an url with the prefix https. I just tried to fix it but the error message remains. My code is:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True

o = Options()
o.add_argument('-private')

driver = webdriver.Firefox(firefox_options=o)
driver.get("https://www.python.org/")

And the message in Firefox is
unbenannt

Could anyone help me, please?
s.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.