Infragistics JQuery controls

Machine learning resources for .NET developers

Greetings friends and welcome to this article on Machine learning libraries for .NET developers.  Machine learning is a hot topic right now and for good reason.  Personally, I haven't been so excited about a technology since my computer used my 2800 baud modem to dial into a BBS over 17 years ago.  The thought that my computer could communicate with another computer was so fascinating to me.  That moment was the very moment that would forever change my life.  I learned a lot about DOS by writing batch scripts and running other programs that allowed me to visit and then run a BBS system.  It eventually lead me to QBasic.  I wanted to learn to write BBS door games and QBasic was included as a part of a standard DOS installation back then. Fast forward 17 years and I'm still in love with computers, programming, and the concept of communication between machines.  The magic never disappeared.  So when i first learned about the concept of Machine learning, I felt like that 13 year old kid again.  The idea that a machine can learn to do things that it has not been programmed to do is now a passion of mine.  The concepts of Machine learning have an extreme learning curve, however, I believe that we as humans can do anything that we put our mind to.  So I began looking around for tutorials on machine learning.  I found many great tutorials and books, however, most of them involved using python.  I have nothing against python.  As a matter of fact, I find it ironic that I started with BASIC and now in this moment of "rebirth" I'm beginning to use python which looks a lot like BASIC in many ways.  The fact of the matter remains, I'm a .NET developer.  I've spent the last 9 years in the .NET framework and I love the technology.  C# is an awesome programming language and it's hard to imagine life without Visual Studio.  What can I say, the IDE has spoiled me. While I scoured the internet looking for tutorials related to Machine learning resources for .NET developers, I wished that there was a one resource that would assist me in my search for resources to help me achieve my goal. Well that's what this article is all about.  In this article, I will introduce you to some .NET libraries that will assist you in your quest to learn about Machine learning. NND Neural Network Designer by Bragisoft The Neural Network Designer project (NND) is a DBMS management system for neural networks that was created by Jan Bogaerts.  The designer application is developed using WPF, and is a user interface which allows you to design your neural network, query the network, create and configure chat bots that are capable of asking questions and learning from your feed back.  The chat bots can even scrape the internet for information to return in their output as well as to use for learning.  The project includes a custom language syntax called NNL (neural network language) that you can use in configuring your machine learning project.  The source code is designed so that the libraries can be used in your own custom applications so you don't have to start from scratch with such a complex set of technologies.  The project is actually an open source project in which I am a part of.  Some of the possibilities offered by this awesome project include predictions, image and pattern recognition, value inspection, memory profiling and much more.  Stop by the Bragisoft NND website and download the application to give it a try.   Screen shots of the neural network designer by Bragisoft A DBMS for neural networks   Mind map rand forrest The chat bot designer and other tools Accord.net Here is a description from the Accord.NET project website  Accord.NET is a framework for scientific computing in .NET. The framework builds upon AForge.NET, an also popular framework for image processing, supplying new tools and libraries. Those libraries encompass a wide range of scientific computing applications, such as statistical data processing, machine learning, pattern recognition, including but not limited to, computer vision and computer audition. The framework offers a large number of probability distributions, hypothesis tests, kernel functions and support for most popular performance measurements techniques.  The most impressive parts of this library has got to be the documentation and sample applications that are distributed with the project.  This makes the library easy to get started using.  I also like the ability to perform operations like Audio processing (beat detection and more), Video processing (easy integration with your web cam, vision capabilities and object recognition).  This is an excellent place to start with approaching Machine learning with the .NET framework.  Here are a two videos that should whet your appetite. Hand writing recognition with Accord.NET   Here is an example of head tracking with Accord.NET (super cool)   AIMLBot Program# AILM Chat bot library AIMLBot (Program#) is a small, fast, standards-compliant yet easily customizable implementation of an AIML (Artificial Intelligence Markup Language) based chatter bot in C#. AIMLBot has been tested on both Microsoft's runtime environment and Mono. Put simply, it will allow you to chat (by entering text) with your computer using natural language.  The project is located here. Math.NET Machine learning algorithms are extremely math heavy.  Math.NET is a library  that can assist with the math that is required to solve machine learning related problems. Math.NET Numerics aims to provide methods and algorithms for numerical computations in science, engineering and every day use. Covered topics include special functions, linear algebra, probability models, random numbers, interpolation, integral transforms and more. DotNumerics DotNumerics is a website dedicated to numerical computing for .NET. DotNumerics includes a Numerical Library for .NET. The library is written in pure C# and has more than 100,000 lines of code with the most advanced algorithms for Linear Algebra, Differential Equations and Optimization problems. The Linear Algebra library includes CSLapack, CSBlas and CSEispack, these libraries are the translation from Fortran to C# of LAPACK, BLAS and EISPACK, respectively. You can find the library here.  ALGLIB ALGLIB is a cross-platform numerical analysis and data processing library. It supports several programming languages (C++, C#, Pascal, VBA) and several operating systems (Windows, Linux, Solaris). ALGLIB features include: Accessing ‘R’ from C#–Lessons learned Here are instructions to use the R statistical framework from within c# ILNumerics You can check out the library at http://www.ilnumerics.net NuML.net http://numl.net A nice site about the basics of machine learning in c# by Seth Juarez . NuML.NET is a machine learning library for .NET developers written by Seth Juarez.  I've recently tried this library and I'm impressed!  Seth has stated publicly that his intention behind the numl.net library is to abstract the scary math away from machine learning to provide tools that are more approachable by software developers and boy did he deliver!  I've been working with this library for a little more than an hour and I've written a prediction app in c#.  You can find his numl.net library source on github. Encog Machine Learning Framework Here is what the official Heaton Research website has to say about Encog: Encog is an advanced machine learning framework that supports a variety of advanced algorithms, as well as support classes to normalize and process data. Machine learning algorithms such as Support Vector Machines, Artificial Neural Networks, Genetic Programming, Bayesian Networks, Hidden Markov Models and Genetic Algorithms are supported. Most Encog training algoritms are multi-threaded and scale well to multicore hardware. Encog can also make use of a GPU to further speed processing time. A GUI based workbench is also provided to help model and train machine learning algorithms. Encog has been in active development since 2008. Encog is available for Java, .Net and C/C++. Jeff Heaton knows a great deal about machine learning algorithms and he's created a wonderful library called Encog.  I was able to write a neural network application that solved the classic XOR problem in 20 minutes after installing the library.  What really amazes me is that he has an Encog Library for JavaScript which includes live samples on his website of Javascript + encog solving problems like the Traveling Salesman Problem and Conway's game of life, all in a browser!  This library can even use your GPU for the heavy lifting if that's your choice.  I would highly recommend that you at least check out his site and download the library to look at the examples.  You can find the Encog library here.    Conclusion This concludes my article on Machine learning resources for the .NET developer.  If you have any suggestions regarding a project that you know of or you are working on related to Machine learning in .NET, please don't hesitate to leave a comment and I will update the article to mention the project.  This article has shown that we as .NET developers have many resources available to us to use to implement Machine learning based solutions.  I appreciate your time in reading this article and I hope you found it useful.  Please subscribe to my RSS feed.  Until next time.. Buddy James


.NET Design Patterns : The decorator pattern. Adding new behavior to your existing objects.

  .NET Design Patterns series: Part 1 The Decorator pattern   A brief introduction to software design patterns Hello and welcome to my first article in a series on design patterns.  A design pattern is simply a documented solution to a common software design problem.  This idea is extremely useful in the world of software development.  When designing and writing code, chances are whatever your task may be, someone has already accomplished what you've been tasked to do.  In fact, many developers have probably accomplished the task at hand.  Why reinvent the wheel?  There are many benefits to practicing and using design patterns. Industry standards Design patterns are deeply ingrained in the world of software development.  As such, you can look at tried and tested design patterns as "best practices".  If you practice and understand solutions that are accepted by the software development community, your software solutions will improve as a result. Efficient Communication Design patterns are defined and described using a unified set of terms.  As you practice design patterns, you will master these terms and in effect, you will be able to communicate much more effiecently with other developers.  You will spend less time trying to describe a potential design when you understand how to describe the concepts clearly by using a unified terminology.  As a result, other junior developers on your team will be more likely to try to learn design patterns which will make your overall team more efficient. Brief history of design patterns Kent Beck and Ward Cunningham began experimentation with design patterns in the context of computer science in the year 1987.  Most of the works on design patterns have been based on their works. Popular books on design patterns Design Patterns: Elements of Reusable Object-Oriented Software Patterns of Enterprise Application Architecture. Pattern-Oriented Software Architecture, Volume 1: A System of Patterns Pattern-Oriented Software Architecture, Volume 2: Patterns for Concurrent and Networked Objects Pattern #1: The Decorator pattern, Adding new behavior to existing objects I've decided to start this series with patterned called the Decorator pattern.  I suppose it's best to start with the formal definition of the pattern. The Decorator Pattern attaches additional responsibilities to an object dynamically.  Decorators provide a flexible alternative to subclass for extending functionality. Too much inheritance can be a bad thing  Inheritance is an important part of object oriented design.  However, just like anything else, too much subclassing can be a bad thing.  The idea behind a great object oriented application is to design your objects with change and reuse in mind.  If you find yourself creating 20+ subclasses of an abstract class, you may want to step back and look at your design.  With each new subclass that you design, there's a another class that you must maintain and change.  Remember, to always design your classes to be Open for extension, closed for modification.  This makes for easier maintienence and flexible designs. The Decorator pattern allows you to add behavior to existing classes at run time through object composition.  This means we create a class to "decorate" another class with new functionality.  The class to be decorated would be passed into the decorator object's constructor and the reference would be stored as a field.  This process can be repeated to achieve new functionality when calling the common contract of the class to be decorated. The article example Imagine the idea of an article.  There are many different types of articles.  There are news paper articles, blog articles, code project articles, magazine articles.  The list goes on and on.  In the age of electronic articles, it would be handy to write an article class and provide a post method.  The post method would contain any external site API calls required to publish the article to it's destination.  When posting an article, you may want to accomplish other tasks at the same time, such as advertise the article.  Perhaps you'd like to advertise your new article via Twitter.   OOP Principals: Open for extension and closed for modification You could add the code to tweet your new article right into your the article base class, however, this would go against our Object Oriented design princiapl "Open for extension, closed for modification".  Wouldn't it be better to add this new behavior to our articles at run time?  The decorator pattern allows us to do just that!   Examine the following class diagram.  And here is the code.. Article.cs   using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DecoratorPatternApplication { /// <summary> /// Defines the methods and properties required for an article to be posted on the web. /// </summary> public abstract class Article { #region "properties" public string Title { get; set; } public string Url { get; set; } public string Body { get; set; } public string Author { get; set; } #endregion #region "methods" /// <summary> /// Provides a method to "Post" the article to it's destination. /// </summary> public abstract void Post(); #endregion } } Decorator.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DecoratorPatternApplication { /// <summary> /// This interface takes an /// </summary> public abstract class Decorator : Article { //Holds a reference to the componoent to be decorated //in this case an article. protected Article _article; /// <summary> /// A emthod to provide the article to be extended. /// </summary> /// <param name="article">The article in which to add new behavior</param> public void SetArticle(Article article) { _article = article; } /// <summary> /// Implementation of the base classes' post method which calls the /// referenced article's post method as well. /// </summary> public override void Post() { if (_article != null) { _article.Post(); } } } } CodeProjectArticle.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DecoratorPatternApplication { /// <summary> /// Represents an article to be posed to codeproject.com /// </summary> public class CodeProjectArticle : Article { public CodeProjectArticle() { } /// <summary> /// This would normally contain any calls to post the article to the codeproject.com automatically /// </summary> public override void Post() { Console.WriteLine("Posting the article {0} to {1}", this.Title, this.Url); Console.WriteLine(); } } } Tweetable.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DecoratorPatternApplication { /// <summary> /// This interface takes an /// </summary> public class Tweetable : Decorator { //Holds a reference to the componoent to be decorated //in this case an article. protected Article _article; public Tweetable(){ } /// <summary> /// A emthod to provide the article to be extended. /// </summary> /// <param name="article">The article in which to add new behavior</param> public Tweetable(Article article) { _article = article; } /// <summary> /// Implementation of the base classes' post method which calls the /// referenced article's post method as well. /// </summary> public override void Post() { base.Post(); if (_article != null) { _article.Post(); } TweetArticle(); } public void TweetArticle() { if (_article != null) { Console.WriteLine("Tweeting about your recent article posting entitled {0}", _article.Title); Console.WriteLine(); } } } } BlogPost.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DecoratorPatternApplication { public class BlogPost : Tweetable { protected Article _article; public BlogPost() { } public BlogPost(Article article) { _article = article; } public override void Post() { base.Post(); Console.WriteLine("Posting a personal blog called {0} to my personal blog site {1}.", this.Title, this.Url); Console.WriteLine(); } } } Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DecoratorPatternApplication { public class Program { public static void Main(string[] args) { //Create an instance of our code project article CodeProjectArticle codeProjectArticle = new CodeProjectArticle { Title = "Code Project Article: Why learn Assembly language?", Author = "Buddy James", Body = "All of the article's body would go here.", Url = "http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language" }; codeProjectArticle.Post(); BlogPost personalBlogPost = new BlogPost { Title = "The Decorator pattern. How to extend the behavior of your existing objects", Author = "Buddy James", Body = "All of the article's contents would go here.", Url = "http://www.refactorthis.net" }; //Lets post a tweet when we post our blog article Tweetable TweetBlogPost = new Tweetable(personalBlogPost); TweetBlogPost.Post(); Console.ReadLine(); } } } I've attached the entire solution so that you can see how it works.  You can download the solution Here DecoratorPatternApplication.zip (78.94 kb)   Notice that the post and tweet methods contain calls to Console.WriteLine().  Obviously in a real scenario these methods would contain calls to actually "post" or "publish" the  article. I hope you've enjoyed my first of many articles on design patterns. Thanks and keep reading! ~/Buddy James kick it on DotNetKicks.com  


Design and Document your Code using PDL (Programming Design Language)

Introduction Many of us underestimate the importance of proper code documentation through comments. Comments, when used correctly, can greatly increase the maintainability of your functions and routines, especially if there is any chance that another developer will ever need to look at your code. It's hard enough for you to remember what your intentions were for a routine you wrote 5 years ago. Imagine what it's like for someone that has no clue what you meant to do in the first place. Background While reading "Code Complete" (every developer, regardless of skill level, age, or programming language should own this book), I discovered a method used to comment your routines that provides so much more than just code comments. Using the Code This method is called PDL (Programming Design Language). The basic idea behind PDL is that you write all of the comments for your method before writing any code. Once the comments are finished, you then fill in the blanks with the implementation. Here is an example: Public Function CanUserBuyAlchohol(ByVal Age As Integer, ByVal HasLicense As Boolean) As Boolean      'If the user is of the legal drinking age          If Age > 21 Then          'If the user has a drivers license                  If HasLicense Then                  'Return success to the caller                          Return True                  'Otherwise the user does not have a drivers license                   Else                     'Return Failure to the caller                          Return False         End If       'Otherwise the user is too young          Else               'Return Failure to the caller                  Return False       End If  End Function     A few things to note here: All of the comments are formatted logically (indentation) When using this method, you write the comments first in a high level format (plain English) This allows you to design the routine at a high level of abstraction The requirements are in English so the routine is designed such that it can be ported to any language very easily All of the thinking work is done up front All that's left is to fill in the code under each comment The comments written in English explain exactly what you need, so implementation is a breeze Since comments are written first, you can be rest assured that all of your methods will be well documented If another developer is reading through your code, he can simply read your high level comments until he finds the code he needs. Points of Interest So as you can see, using PDL has several advantages: Assures code is always documented Allows for high level design of routine that does not rely on a specific programming language implementation (remember the comments are plain English) Once the comments are complete, coding is a snap because the logic has already been documented in plain English in the comments. I hope you find PDL as beneficial to learn as I have. Don't forget to buy Code Complete! Until next time.   kick it on DotNetKicks.com  


About the author

My name is Buddy James.  I'm a Microsoft Certified Solutions Developer from the Nashville, TN area.  I'm a Software Engineer, an author, a blogger (http://www.refactorthis.net), a mentor, a thought leader, a technologist, a data scientist, and a husband.  I enjoy working with design patterns, data mining, c#, WPF, Silverlight, WinRT, XAML, ASP.NET, python, CouchDB, RavenDB, Hadoop, Android(MonoDroid), iOS (MonoTouch), and Machine Learning. I love technology and I love to develop software, collect data, analyze the data, and learn from the data.  When I'm not coding,  I'm determined to make a difference in the world by using data and machine learning techniques. (follow me at @budbjames).  

Related links

Month List