本文基于NumSharp用C#改写了一个用python实现的简单线性回归,通过这次实践,可以加深对线性回归原理的理解,也可以练习使用NumSharp。

前言

最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写。

NumSharp简介

NumSharp(NumPy for C#)是一个在C#中实现的多维数组操作库,它的设计受到了Python中的NumPy库的启发。NumSharp提供了类似于NumPy的数组对象,以及对这些数组进行操作的丰富功能。它是一个开源项目,旨在为C#开发者提供在科学计算、数据分析和机器学习等领域进行高效数组处理的工具。

python代码

用到的python代码来源:llSourcell/linear_regression_live: This is the code for the “How to Do Linear Regression the Right Way” live session by Siraj Raval on Youtube (github.com)

下载到本地之后,如下图所示:

python代码如下所示:

#The optimal values of m and b can be actually calculated with way less effort than doing a linear regression. 
#this is just to demonstrate gradient descent

from numpy import *

# y = mx + b
# m is slope, b is y-intercept
def compute_error_for_line_given_points(b, m, points):
   totalError = 0
   for i in range(0, len(points)):
       x = points[i, 0]
       y = points[i, 1]
       totalError += (y - (m * x + b)) ** 2
   return totalError / float(len(points))

def step_gradient(b_current, m_current, points, learningRate):
   b_gradient = 0
   m_gradient = 0
   N = float(len(points))
   for i in range(0, len(points)):
       x = points[i, 0]
       y = points[i, 1]
       b_gradient += -(2/N) * (y - ((m_current * x) + b_current))
       m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current))
   new_b = b_current - (learningRate * b_gradient)
   new_m = m_current - (learningRate * m_gradient)
   return [new_b, new_m]

def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):
   b = starting_b
   m = starting_m
   for i in range(num_iterations):
       b, m = step_gradient(b, m, array(points), learning_rate)
   return [b, m]

def run():
   points = genfromtxt("data.csv", delimiter=",")
   learning_rate = 0.0001
   initial_b = 0 # initial y-intercept guess
   initial_m = 0 # initial slope guess
   num_iterations = 1000
   print ("Starting gradient descent at b = {0}, m = {1}, error = {2}".format(initial_b, initial_m, compute_error_for_line_given_points(initial_b, initial_m, points)))
   print ("Running...")
  [b, m] = gradient_descent_runner(points, initial_b, initial_m, learning_rate, num_iterations)
   print ("After {0} iterations b = {1}, m = {2}, error = {3}".format(num_iterations, b, m, compute_error_for_line_given_points(b, m, points)))

if

文章来源于互联网:
用C#实现简单的线性回归