3

前言

由于场景不同,数据挖掘适合的编程语言不同。在模型原型开发阶段,可能R和python比较适合;在模型上线阶段,可能Java和python比较合适。而不同的线上框架又支持不同的语言,比如JStorm只能用Java搞,而Spark则比较友好,同时支持Java和python两种语言。同样的情况也发生下原型开发阶段:如果是单机环境,R和python都很不错;但假如数据较大要放到诸如阿里云ODPS分布式平台,则没法用R,只能用python,而且python只能用numpy库,没法用sklearn。因此,算法工程师需要具备使用不同编程语言实现同一算法的能力。

线性回归是最基础的数据挖掘算法。本文对其不同语言的实现进行简单介绍。

python

numpy

import numpy as np

x = np.array([0, 1, 2, 3])
y = np.array([-1, 0.2, 0.9, 2.1])

A = np.vstack([x, np.ones(len(x))]).T
m, c = np.linalg.lstsq(A, y)[0]
print(m, c)

import matplotlib.pyplot as plt
plt.plot(x, y, 'o', label='Original data', markersize=10)
plt.plot(x, m*x + c, 'r', label='Fitted line')
plt.legend()
plt.show()

sklearn

from sklearn import linear_model
clf = linear_model.LinearRegression() # linear_model.LinearRegression(fit_intercept=False)
clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
clf.coef_

sklearn的linear_model的fit方法,底层是调用了numpy的linalg.lstsq方法,相当于将一个函数封装为对象的一个方法,将面向过程转化为面向对象的编程模式。源码

R

x <- c(0, 1, 2, 3)
y <- c(-1, 0.2, 0.9, 2.1)
df <- data.frame(x,y)

lr_model <- lm(y ~ x) # lm(y ~ x - 1) # without intercept
summary(lr_model)

library(ggplot2)
ggplot() + geom_point(aes(x=x, y=y), data=df) + geom_abline(slope=lr_model$coefficients[2], intercept=lr_model$coefficients[1])

Java

Java可采用Apache Commons Math库进行线性回归。

Simple regression

一元线性回归

regression = new SimpleRegression(); // new SimpleRegression(false); // without intercept
regression.addData(1d, 2d);
regression.addData(3d, 3d);
regression.addData(3d, 3d);
// double[][] data = { { 1, 3 }, {2, 5 }, {3, 7 }, {4, 14 }, {5, 11 }};
// regression.addData(data);

System.out.println(regression.getIntercept());
System.out.println(regression.getSlope());

Multiple linear regression

多元线性回归

OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
double[] y = new double[]{11.0, 12.0, 13.0, 14.0, 15.0, 16.0};
double[][] x = new double[6][];
x[0] = new double[]{0, 0, 0, 0, 0};
x[1] = new double[]{2.0, 0, 0, 0, 0};
x[2] = new double[]{0, 3.0, 0, 0, 0};
x[3] = new double[]{0, 0, 4.0, 0, 0};
x[4] = new double[]{0, 0, 0, 5.0, 0};
x[5] = new double[]{0, 0, 0, 0, 6.0};          
regression.newSampleData(y, x);
double[] beta = regression.estimateRegressionParameters();

关于作者:丹追兵:数据分析师一枚,编程语言python和R,使用Spark、Hadoop、Storm、ODPS。本文出自丹追兵的pytrafficR专栏,转载请注明作者与出处:https://segmentfault.com/blog...


丹追兵
776 声望357 粉丝

本人年少时在欧洲三国边境小城Aachen游学,瞻仰了两位机械泰斗的风采,然未继承任何技能,终日游手好闲四处转悠。归国后,有感于在机械行业难有建树,遂投身互联网,遇大牛周公,授我以Python和Hadoop大法,立足...