10 ms·
I used to do a lot of machine learning code in go and think it has great potential as a compiled, static language with similar ease of development to python. H
by micro_cam 6y ago
I used to do a lot of machine learning code in go and think it has great potential as a compiled, static language with similar ease of development to python.
However it is hard to get around the lack of operator overloading and (to a lesser extent at least to me) generics. I love the simplicity of the language and understand their feeling that operator overriding is too often abused but at the same time not being able to use algebraic operators for matrix and tensor libraries makes them really hard to use.
The compacting garbage collector can also make it hard to pass pointers to memory to non go libraries which is key in data science.
If this project could address those things I think it could have real potential
- elcritch 6y agoInteresting, I wouldn’t have thought of Go for ML. But I do share the enjoyment of static languages for Ml/data science. You might give Nim a look as it’s pretty practical for wrapping C++ code!
- matsemann 6y agoRef operator overloading. As someone not used to python but had to read a simple numpy script last week, I was stumped for a while on this line of code: X[y==1,0] Just that.I first thought, what would X[False,0] be? Since y was a vector, it obviously wouldn't be equal to one. Okey, but extracting that part, it looks like y==1 takes my vector, and replaces with an array of same size, with true or false for each element. Basically == is overridden to run a predicate over all elements. Okey, but then what does X[[True,False,False..],0] mean? Looks like numpy has overridden the [] so one can pass an array of booleans in addition to a normal index, and then it only keeps those elements corresponding to True indexes. Clever and useful when done daily I guess, but damn it was hard to understand those 9 characters as someone not well-versed in this domain.
- marcus_holmes 6y agoI never understand why operator overloading is said to make things more readable. If the meaning of an operator can change wildly with the operands then that's just confusing - you can't assume that '==' means what you think it means and you have to go find out what it means. In comparison, having an actual function name to clue me in on what something does is useful. Like, how is "X[y==1,0]" more readable in this case than something like "filterElements(arrayToFilter, arrayOfBools)"? (if I've understood what the original was trying to do, which I'm not sure I have). People seem to confuse "less typing" with "simpler", and that's not true. One of the great strengths of Go is that it rejects this and embraces true simplicity.
- grayclhn 6y agoLong expressions with matrix operations is a pretty standard example. When people talk about operator overloading in data science, they usually mean “standard operations on various arrays of numbers,” which are defined in common libraries or the programming language. Not “I need to define my own ad hoc equalities.”
- marcus_holmes 6y agoyeah, I get this. If there are standard definitions of operations that everyone understands, that's fine. But I always think that maybe we should be using new operators for this, instead of overloading existing ones that have other, different, meanings in different contexts.
- grayclhn 6y agoIn a data science context, the key operations are math, so overloading makes a lot of sense and is massively helpful in implementing algorithms and equations. I go back and forth on the wisdom of some of the other common uses — filtering, etc. In addition to the problems that have been mentioned, there are often hidden and infrequent but painful performance issues.
- marcus_holmes 6y agoI often think that maths could use the same slap around the chops. Less arcane operators and symbols, more explicit function names please!
- grayclhn 6y agoI consider it kind of important that the notation for expressions like “A²” doesn’t depend on whether A is an integer, real number, complex number, matrix, random variable, etc., (even if the results do) or what the specific domain is, but if you feel like it’s important to embed all of that context in the exponent operator... give it a try :) (And whether “2” is integer, real, rational, complex, etc)
- iujjkfjdkkdkf 6y agoI find this is common in python: there are nice shorthand things you can do that are definitely powerful, but they are not easy to understand nor to remember. Particularly with conditions applied to arrays / series this is a problem. "Truth of a series is ambiguous" is one of my most frequent errors. That said, the overall ecosystem still makes python the most practical general data science language in my view.
- DougBTX 6y agoThat example is using “logical vectors”, which you’d come across in more data-science languages like Matlab, Octave, R, etc. Julia[1] has a more modern take on y==1, by having explicit syntax for element-wise operations, so it uses y.==1 instead. What I’m really saying is that there’s quite a bit of precedent for that syntax, but it comes from a more specialised field so it is easy to have not come across it before. [1] https://docs.julialang.org/en/v1/manual/functions/#man-vectorized https://docs.julialang.org/en/v1/manual/functions/#man-vecto...
- nonameiguess 6y agoMATLAB introduced automatic broadcasting of operators over n-dimensional arrays and logical indexing nearly 40 years and it is still the primary learning language for applied mathematicians, engineers, and scientists, and also a popular prototyping language for numerical algorithm developers. And it provides a great interactive REPL with built-in plotting for exploratory data analysis. Since doing this, the idea and basic syntax has been adopted by GNU Octave, S, R, and now NumPy and Matplotlib, which did it to make it easier for statisticians, engineers, and scientists to adopt Python. Specifically targeting these groups with familiar syntax is exactly why Python is so popular for data science, because data scientists tend to recruited from the hard engineering and science disciplines. It's a lot easier to teach basic programming to someone with a great background in applied math, experimental design, and research methods, than it is to teach all those things to programmers. This is an area in which languages with operator overloading shine, creating DSLs that mimic the syntax and semantics of other languages. You might have a lot to learn because you're used to == only being defined for scalar data types and arrays only being indexed by natural numbers, but the people the language is designed for are used to broadcasted operators and logical array indexing.
- vallas 6y ago> With similar ease of development to Python Isn't the goal of general typed languages like Go or Rust to run -not build- the scripts of softwares in data science for example? I wouldn't compare Python and Go, it's different use case to me. While Go looks to be in the middle, Rust is at the opposite of Python and it must be a good to choice for building data software that run data scripts. > The [Go] lack of operator overloading => https://doc.rust-lang.org/rust-by-example/trait/ops.html https://doc.rust-lang.org/rust-by-example/trait/ops.html > The [Go] lack of generics => https://doc.rust-lang.org/book/ch10-01-syntax.html https://doc.rust-lang.org/book/ch10-01-syntax.html > not being able to use algebraic operators for matrix and tensor libraries https://tensorflow.github.io/rust/tensorflow/struct.Tensor.html https://tensorflow.github.io/rust/tensorflow/struct.Tensor.h...
- s17n 6y agoAt Google, Go is mostly used for stuff that they would have used Python for in the past. Idk about the rest of the world.
- great_reversal 6y agoCurrently working as a backend dev in a mid-sized company. Current directive is a gradual migration to Go for backend services that used to be written in Python/Django.
- CameronNemo 6y agoWhy?
- AlexCoventry 6y agoGo is a more restrictive language, which makes it slightly harder to create horrible codebases. It's also faster and a bit cheaper to deploy.
- DangitBobby 6y ago
- mountainriver 6y agoOperator overloading and the Go->C FFI are pretty big hinderances. Go just wasn’t designed for this kind of work. Which is unfortunate because it brings a lot of great things to the table. Vlang is probably the closest spiritual successor that would work, or someone just needs to write a new language