线性回归
- 最小二乘法
- 梯度下降法
最小二乘法
-
数学原理
-
model:
m个sample,每个sample有n个特征,引入以下几个记号
我们有:
-
均方差:MES
梯度:
- 注意:E的梯度是一个向量函数,是一个列向量
-
最小二乘:
-
-
在编程中遇到的问题
-
python 面向对象编程-类的创建
- 用class 创立类,调用类的方法之前先创建类的实例;默认类的构建函数init函数参数为空,如果自己定义init注意传参数
- py和cpp不同,self相当于this指针;没有private,public声明,通过命名法区别类的私有函数和公有函数,代表是private的函数
-
python导入数据集
-
这里使用的是numpy.genfromtxt()函数
genfromtxt(‘path’;delimiter’分割字符’还有很多参数)
-
-
用numpy处理数组
- 矩阵切片:[ : , : ]“,”前表示行的切片
-
划分数据集
- 用到sklearn.model_selection.train_test_split
-
import numpy as np
#最小二乘法
class olsLinearRegression:
# X预处理
def _preprocessing(self,X):
m,n = X.shape
X_ = np.empty((m,n+1))
X_[:,:-1] = X
X_[:,-1] = 1
return X_
#求self.w
def _ols(self,X,y):
temp = np.linalg.inv(np.matmul(X.T,X))
temp_ = np.matmul(X.T,y)
return np.matmul(temp,temp_)
#训练model
def train(self,X,y):
X = self._preprocessing(X)
self.w = self._ols(X,y)
#做预测
def predict(self,X):
X = self._preprocessing(X)
return np.matmul(X,self.w)
#导入数据集
data = np.genfromtxt('E:\winequality-red.csv',delimiter = ';',skip_header = True)
X = data[:,:-1]
y = data[:,-1]
#划分数据集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)
#创建类的实例
ols = olsLinearRegression()
#训练模型并得到预测结果
ols.train(X_train,y_train)
y_pred = ols.predict(X_test)
#性能指标:均方差误差
from sklearn.metrics import mean_squared_error
mes = mean_squared_error(y_pred,y_test)
print(mes)