目標(biāo)
1. 最值歸一化
#!/usr/bin/env python3
import numpy as np
class SimpleLinearRegression:
def __init__(self):
"""模型初始化函數(shù)"""
self.a_ = None
self.b_ = None
def fit(self, x_train, y_train):
"""根據(jù)訓(xùn)練數(shù)據(jù)集x_train,y_train訓(xùn)練模型"""
assert x_train.ndim ==1, \
"簡(jiǎn)單線性回歸模型僅能夠處理一維特征向量"
assert len(x_train) == len(y_train), \
"特征向量的長(zhǎng)度和標(biāo)簽的長(zhǎng)度相同"
x_mean = np.mean(x_train)
y_mean = np.mean(y_train)
num = (x_train - x_mean).dot(y_train - y_mean) # 分子
d = (x_train - x_mean).dot(x_train - x_mean) # 分母
self.a_ = num / d
self.b_ = y_mean - self.a_ * x_mean
return self
def predict(self, x_predict):
"""給定待預(yù)測(cè)數(shù)據(jù)集x_predict秉剑,返回表示x_predict的結(jié)果向量"""
assert x_predict.ndim == 1, \
"簡(jiǎn)單線性回歸模型僅能夠處理一維特征向量"
assert self.a_ is not None and self.b_ is not None, \
"先訓(xùn)練之后才能預(yù)測(cè)"
return np.array([self._predict(x) for x in x_predict])
def _predict(self, x_single):
"""給定單個(gè)待預(yù)測(cè)數(shù)據(jù)x_single菲宴,返回x_single的預(yù)測(cè)結(jié)果值"""
return self.a_ * x_single + self.b_
def __repr__(self):
"""返回一個(gè)可以用來表示對(duì)象的可打印字符串"""
return "SimpleLinearRegression()"
x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 3., 5.])
x_predict = np.array([6])
reg = SimpleLinearRegression()
reg.fit(x, y)
print(reg.predict(x_predict))
print(reg.a_)
2. 多元線性回歸
#!/usr/bin/env python3
class LinearRegression:
def __init__(self):
"""初始化Linear Regression模型"""
self.coef_ = None # 系數(shù)(theta0~1 向量)
self.interception_ = None # 截距(theta0 數(shù))
self._theta = None # 整體計(jì)算出的向量theta
def fit_normal(self, X_train, y_train):
"""根據(jù)訓(xùn)練數(shù)據(jù)X_train入桂,y_train訓(xùn)練Linear Regression模型"""
assert X_train.shape[0] == y_train.shape[0], \
"the size of X_train must be equal to the size of y_train"
# 正規(guī)化方程求解
X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)
self.interception_ = self._theta[0]
self.coef_ = self._theta[1:]
return self
def predict(self, X_predict):
"""給定待預(yù)測(cè)的數(shù)據(jù)集X_predict,返回表示X_predict的結(jié)果向量"""
assert self.interception_ is not None and self.coef_ is not None, \
"must fit before predict"
assert X_predict.shape[1] == len(self.coef_), \
"the feature number of X_predict must be equal to X_train"
X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])
y_predict = X_b.dot(self._theta)
return y_predict
def score(self, X_test, y_test):
"""很倔測(cè)試機(jī)X_test和y_test確定當(dāng)前模型的準(zhǔn)確率"""
y_predict = self.predict(self, X_test)
return r2_score(y_test, y_predict)
def __repr__(self):
return "LinearRegression()"
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
boston = datasets.load_boston()
X = boston.data
y = boston.target
X = X[y < 50.0]
y = y[y < 50.0]
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
reg = LinearRegression()
reg.fit_normal(X_train, y_train)
print(reg.coef_)