写一个简单的线性回归算法(LinearRegression),该算法主要基于最小二乘法来寻找最合适的权重。
即通过最小二乘法解 y = w*X 中的w。这里X是一个向量,X=[x0, x1, x2, x3, …],x0为1,用于抵消常数项,所求的w也实际上是w=[w0, w1, w2, w3, …]。
根据最小二乘法,最合适的权重为(X.T*X)-1*X.T。(不清楚的小伙伴可以看百度百科)
直接用X乘上该权重,就可以得到预测的y。
#!/usr/local/bin/python3
# -*- coding: UTF-8 -*-
import numpy as np
class LinearRegression:
"""
LinearRegression based on Least Squares
"""
def __init__(self):
pass
def PseudoInverse(self, X):
"""
get pseudo-inverse
"""
return np.linalg.inv(np.dot(X.T, X)).dot(X.T)
def GetWlin(self, X, y):
"""
get best w
"""
return self.PseudoInverse(X).dot(y)
def CalError(self, X, y, w):
N = X.shape[0]
Ein = np.linalg.norm(np.dot(X, w)-y)
Ein = np.sqrt(Ein)/N
return Ein
def fit(self, X, y):
W_lin = self.GetWlin(X, y)
Ein = self.CalError(X, y, W_lin)
return W_lin, Ein
def predict(self, X, y, new_X):
W_lin = self.GetWlin(X, y)
return np.dot(new_X, W_lin)
调用predict函数(需要传入训练集的X与y,测试集的X)就可以预测出y。