机器学习篇(2)——最小二乘法概念最小二乘法

前言:主要介绍了从最小二乘法到

  • 概念

顾名思义,线性模型就是可以用线性组合进行预测的函数,如图:

image.png

公式如下:

image.png

image.png

误差是独立同分布的,服从均值为0,方差为某定值s2的高斯分布。 原因:中心极限定理 实际问题中,很多随机现象可以看做众多因素的独立影响的综合反应,往往服从正态分布 写出损失函数:

image.png

求解:

image.png

求得的杰刚好和线性代数中的解相同

  • 最小二乘法

用投影矩阵可以解决线代中方程组无解的方法就是最小二乘法,其解和上述解一样

image.png

例子:用最小二乘法预测家用功率和电流之间的关系 数据来源:http://archive.ics.uci.edu/ml/datasets/Individual+household+electric+power+consumption 代码如下:

from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib as mpl
import matplotlib.pyplot as plt
import time
#防止中文乱码
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
#加载数据
path = "household_power_consumption_1000.txt"
df = pd.read_csv(path,sep=";",low_memory=False)

#功率和电流之间的关系
X = df.iloc[:,2:4]
Y = df.iloc[:,5]
#数据集划分两个参数test_size表示怎么划分,random_state固定随机种子类似于在执行random模块时候,给一个随机种子random.seed(0),之后每次运行的随机数不会改变
x_train,x_test,y_train,y_test=train_test_split(X,Y,test_size=0.2,random_state=0)
#转化为矩阵形式,进行最小二乘法运算,即矩阵的运算
x1 = np.mat(x_train)
y1 = np.mat(y_train).reshape(-1,1)#转化为一列-1表示一后面1列为标准
#带入最小二乘公式求θ
theat = (x1.T*x1).I*x1.T*y1
print(theat)
#对测试集进行训练
y_hat = np.mat(x_test)*theat
#画图看看,预测值和实际值比较200个预测值之间的比较
t = np.arange(len(x_test))
plt.figure()
plt.plot(t,y_test,"r-",label=u'真实值')
plt.plot(t,y_hat,"g-",label=u'预测值')
# plt.legend(loc = 'lower right')
plt.title(u"线性回归预测功率与电流之间的关系", fontsize=20)
plt.grid(b=True)
plt.show()

输出结果:θ=[[4.20324605], [1.36676171]] 预测结果:

image.png

其中”from sklearn.model_selection import train_test_split“中的数据划分模块可以用底层代码实现,实现如下:

import random
import csv
def loadDataset(fileName,split,trainingSet=[],textSet=[]):
    with open(fileName, "r") as f:
        reader = csv.reader(f)
        data = list(reader)
        for x in range(len(data) - 1):
            for y in range(4):
                data[x][y] = float(data[x][y])
            if random.random() < split:
                trainingSet.append(data[x])
            else:
                textSet.append(data[x])
        return trainingSet,textSet
trainingSet,textSet=loadDataset("irisdata.csv",0.7)
print(trainingSet)
print(textSet)

调用sklearn实现代码如下:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd
from pandas import DataFrame
import matplotlib as mpl
import matplotlib.pyplot as plt
import time
#加载数据
path="household_power_consumption_1000.txt"
df = pd.read_csv(path,sep=";")
#数据处理,包括,清除空数据
df1=df.replace("?",np.nan)
data = df1.dropna(axis=0,how="any")
#把数据中的字符串转化为数字
def data_formate(x):
    t = time.strptime(' '.join(x), '%d/%m/%Y %H:%M:%S')
    return (t.tm_year, t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec)
X = data.iloc[:,0:2]
x = X.apply(lambda x:pd.Series(data_formate(x)),axis=1)
y = data.iloc[:,4]
#数据分集
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
#标准化
ss = StandardScaler()
x_train=ss.fit_transform(x_train)
x_test=ss.transform(x_test)
#模型训练
lr = LinearRegression()
lr.fit(x_train,y_train)
y_pridect=lr.predict(x_test)
#输出参数
print("模型的系数(θ):",lr.coef_)
print("模型的截距:",lr.intercept_)
print("训练集上R2:",lr.score(x_train, y_train))
print("测试集上R2:",lr.score(x_test, y_test))
mse = np.average((y_pridect-y_test)**2)
rmse = np.sqrt(mse)
print("rmse:",rmse)
#画图
t=np.arange(len(y_test))
plt.figure(facecolor='w')#建一个画布,facecolor是背景色
plt.plot(t, y_test, 'r-', linewidth=2, label='真实值')
plt.plot(t, y_pridect, 'g-', linewidth=2, label='预测值')
plt.legend(loc = 'upper left')#显示图例,设置图例的位置
plt.title("线性回归预测时间和功率之间的关系", fontsize=20)
plt.grid(b=True)#加网格
plt.show()

注意: LinearRegression返回的参数,有θ,截距,正确率,以及rmse 数据一般需要标准化,用StandardScaler 结果如下:模型的系数(θ): [ 0.00000000e+00 8.88178420e-16 -6.08846044e+00 -4.01611493e+00 -4.41741494e-01 0.00000000e+00] 模型的截距: 10.463250000000013 训练集上R2: 0.2648347024910076 测试集上R2: 0.13627227933073027 rmse: 4.766714115205903

image.png

关于R2的概念,他是衡量数据集是否为线性的依据。叫判定系数、拟合优度,决定系数。 参数解释的原文如下:

The coefficient R^2 is defined as (1 - u/v), where u is the regression sum of squares ((y_true - y_pred) ** 2).sum() and v is the residual sum of squares ((y_true - y_true.mean()) ** 2).sum().

image.png 模型模拟的越好,越接近于一

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏智能算法

深度学习三人行(第3期)---- TensorFlow从DNN入手

22220
来自专栏梦里茶室

TensorFlow深度学习笔记 文本与序列的深度模型

Deep Models for Text and Sequence Rare Event 与其他机器学习不同,在文本分析里,陌生的东西(rare event)往...

227100
来自专栏算法channel

高斯混合模型:不掉包实现多维数据聚类分析

《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来...

41760
来自专栏量化投资与机器学习

【Python机器学习】系列之从线性回归到逻辑回归篇(深度详细附源码)

第1章 机器学习基础 将机器学习定义成一种通过学习经验改善工作效果的程序研究与设计过程。其他章节都以这个定义为基础,后面每一章里介绍的机器学习模型都是按照这个...

628100
来自专栏人工智能

反馈型神经网络

反馈型神经网络(recurrent networks)是一种从输出到输入具有反馈连接的神经网络,其结构比前馈网络要复杂得多。典型的反馈型神经网络有Elman网络...

48580
来自专栏AI研习社

CS231n 课后作业第二讲 : Assignment 2(含代码实现)| 分享总结

CS231n 是斯坦福大学开设的计算机视觉与深度学习的入门课程,授课内容在国内外颇受好评。其配套的课后作业质量也颇高,因此雷锋网 AI 研习社在近期的线上公开...

527100
来自专栏人工智能头条

基于Python的卷积神经网络和特征提取

47040
来自专栏用户3246163的专栏

2.1 统计基础

主要用在线性回归的时候来估计b1 unbiasedness: 估计的残差是随机的 efficiency:对比其他估计样本残差最小 consistency:样本增...

28730
来自专栏程序生活

机器学习(十三)缺失值处理的处理方法总结

21920
来自专栏机器之心

教程 | 如何判断LSTM模型中的过拟合与欠拟合

选自MachineLearningMastery 作者:Jason Brownlee 机器之心编译 参与:Nurhachu Null、路雪 判断长短期记忆模型在...

1.7K100

扫码关注云+社区

领取腾讯云代金券