线性回归-最小二乘方法
使用最小二乘的方法进行原始的计算方式编写
先把该导入的包全部导入了
# 首先需要导入对应的包
import pandas as pd # 数据处理
import numpy as np # 数据计算
import matplotlib.pyplot as plt # 画图
from sklearn.model_selection import train_test_split # 专门用于数据分割的函数,分割训练集和测试集
# 因为画图,所以先设置字符集防止中文无法显示的问题
plt.rcParams['font.sans-serif'] = [u'simHei']
plt.rcParams['axes.unicode_minus'] = False
1 读取数据
数据存储在文件中需要读取,现在使用的数据是用户的不同时间段家用电量的表格
dir = './data/household_power_consumption_1000.txt'
# 使用pandas进行数据导入
# 使用的是;进行分隔,数据中可能存在大量对的混合类型,所以需要进行low_menorey设置
data_source = pd.read_csv(dir, sep=';', low_memory=False)
数据导入完成后查看下数据,大致分清需要哪些数据参数计算,由于是估计功率和电流之间的关系,所以取出数据的时候就需要取出对应的数据即可
2 取出数据
# 根据数据的内容而言,数据结构如下
# 日期、时间、有功功率、无功功率、电压、电流、厨房用电功率、洗衣服用电功率、热水器用电功率
# 寻找功率和电流之间的关系
# 这里就需要对数据(可以看做是一个二维矩阵)进行切片选出需要的数据
X = data_source.iloc[:, 2:4] # 切片不包括最后一项
Y = data_source.iloc[:, 5]
pandas的数据结构中可以直接使用iloc进行切片,其切片的规则和numpy中的规则非常相似,因为数据本身是一个表格,这个表格有行有列,只有两个数据维度,那么每个样本存在多个数据,每个属性就是一列
3 分割数据
这里采用的是随机划分,将数据划分成为训练集:测试集=4:1的形式,使用随机抽样的方法,当然分割数据肯定不止是这一种方式,这里先使用这种随机划分的方式
# 划分数据,test_size是按照比例,random_state是表示随机种子
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
4 数据变化
直接的pandas数据不好计算,转成numpy数据进行处理,之后使用最小二乘的时候对矩阵的求逆矩阵,求转置等等,方便计算
# 建立两个训练数据的关系
x_train = np.mat(X_train)
y_train = np.mat(Y_train).reshape(-1,1) # 因为y实际上搞出来不是一个列向量,这里进行转一把
这里有个坑,如果本身的pandas就是一列的话这里直接转回造成数据的矩阵型状无法参与后面的计算,所以这里需要转变一下
5 计算出系数矩阵
theta的求解利用最小二乘的方式,根据理论,中间的计算推导步骤很麻烦,要用到矩阵求导,大量的矩阵变化,好在我们直接有最后的公式
Θ = ( X T X ) − 1 X T Y \Theta = (X^T X)^{-1} X^T Y Θ=(XTX)−1XT