2020-04-17

                        机器学习之线性回归

广义线性模型

1.定义

目标值 y 是输入变量 x 的线性组合。 数学概念表示为:如果 y

 是预测值,那么有:y(w,x) = w0+w1x1+w2x2+...wnxn 

在整个模块中,我们定义向量 w = (w0,w1,...wn) 作为 coef_ ,定义 w0 作为 intercept_

 作为 coef_ ,定义 作为 intercept_ 。

2.理论依据:

(1)拟合:(找函数)

科学工程问题可以通过诸如采样实验等方法获得若干离散的数据,根据这些数据,我们往往希望得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据相吻合,这过程就叫做拟合(fitting)

(2)插值:(找值满足条件的函数)

给定 n个离散数据点(称为节点)(xi,yi) i=1,2,...n,对于x(x != xi,i=1,2...n),求 x所对应的 y的值称为内插.

f(x)为定义在区间 [a,b]上的函数。x1,x2...xn为[a,b]上n个互不相同的点, G为给定的某一函数类。若G上有函数 g(x)满足:g(xi) = f(xi),k = 1,2,....,n则称g(x)为f(x)关于节点在 G上的插值函数。

(3)最小二乘法:

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。


(4)奇异性:

从数学角度来说,所谓奇异性就是指函数的不连续或导数不存在,表现出奇异性的点称为奇异点...

3.总结

我们在实际生产生活或是实验中获得了一些数据,例如(x,y)这样的二元组,当我们想知道这些数据之间的联系时,找到它的数学表达式就是一种不错的方法。此时,你可能会想到用 ‘拟合’ 的方式去找到它的数学表达式,想要拟合,就离不开插值。

我们在现实生活中得到的数据,不可能总是完美的找到一条曲线,恰好可以将获得的数据拟合,所以在拟合的过程中会产生一些误差,所谓的误差,就是实际数据值与预测数据值之间的差。我们总是希望找到一条曲线,该条曲线可以最大程度的代替我们得到的数据。换句话说,如果我们找到一条曲线,它的预测值与实际值的差的平方和最小,那么该条曲线不就可以最大程度的代替我们得到的数据吗?所以此时问题就转化到了求预测值与实际值的差的平方和最小上面来了,这就是最小二乘法!在最小二乘法求解时,会用到求导。为什么要用求导的方式?

点动成线,线动成面,在立体空间中,一个曲面是由很多条曲线组成的,你如果想要找该曲面的最值,就相当于找这个曲面的最高点或最低点。如果你沿着这个面的某一条线的切线走,它不就可以以最快的速度到达最值点(最高点或最低点),这就是为什么要求导数,而且求导还可以起到降维的效果(平方求导就会变成一次方),简化运算,

3.应用场景

线性回归模型常用来预测连续性目标值(分类的目标变量是离散型数据)的数值,


4.代码实现

sklearn 中的线性回归模型有以下参数:

          fit(X,y),训练,拟合参数

          predict(X),预测

          score(X,y), 得到评分结果

          coef_,存放回归系数

          intercept_,存放截距

(1)简单的函数回归分析



以下是代码:

import random

#调用 sklearn 中的线性模型

from sklearn import linear_model

reg = linear_model.LinearRegression()

def generate(x):

    #在数据较少时增加随机数扰动(random.random()),可以更好的使模型泛化。

    y = 2*x+10+random.random()

    return y

train_x = []

train_y = []

for x in range(1000):

    train_x.append([x])

    y = generate(x)

    train_y.append([y])

#使用 fit 函数进行模型训练

reg.fit (train_x, train_y)

# coef_ 保存线性模型的系数w

print(reg.coef_)

print(reg.intercept_)

(2)糖尿病回归分析

数据集Diabetes,包含442个患者的10个生理特征(年龄,性别、体重、血压)和一年以后疾病级数指标。

10项特征:

年龄,性别,体质指数,血压 以及 s1,s2,s3,s4,s4,s6  (六种血清的化验数据)

"""

使用sklearn自带的糖尿病数据集,进行回归分析

Diabetes:包含442个患者的10个生理特征(年龄,性别、体重、血压)(x)和一年以后疾病级数指标(y)

"""



以下是代码:

from sklearn import datasets

from sklearn import linear_model

from sklearn.model_selection import train_test_split 

from sklearn.metrics import mean_squared_error

import pandas as pd

# 加载数据

diabetes = datasets.load_diabetes()

data = diabetes.data

# print(pd.DataFrame(data).head())

# 数据探索

# print(data.shape)

# print(data)

# 训练集 70%,测试集30%

train_x, test_x, train_y, test_y = train_test_split(diabetes.data, diabetes.target, test_size=0.3, random_state=14)

# print(len(train_x))

#回归训练及预测

clf = linear_model.LinearRegression()

clf.fit(train_x, train_y)

#该模型的系数是一个10行一列的 np 数组

print(clf.coef_)

#print(train_x.shape)

#print(clf.score(test_x, test_y))

#给出一个人的 10 项指标(x),预测一年以后的病情(y)

pred_y = clf.predict(test_x)

print(mean_squared_error(test_y, pred_y))

(3)股票回归分析

pandas 专门提供了从财经网站上获得数据的接口,我们需要使用时,只需使用 pip 命令安装pandas_datareader 接口就可以了。

命令:pip install pandas_datareader



以下是代码:

import statsmodels.api as sm

import statsmodels.formula.api as smf

import statsmodels.graphics.api as smg

import patsy

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

from pandas import Series,DataFrame

from scipy import stats

import seaborn as sns

import datetime, os, warnings

warnings.filterwarnings('ignore')

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签

plt.rcParams['axes.unicode_minus'] = False  #可以显示负号

# 设置起始时间

start = datetime.datetime(2019,1,1)

end = datetime.datetime(2019,12,31)

from pandas_datareader.data import DataReader

# 读取上证综指 及 探路者数据

def load_data():

    if os.path.exists('000001.csv'):

        data_ss = pd.read_csv('000001.csv')

        data_tlz = pd.read_csv('300005.csv')

    else:

        # 上证综指

        data_ss = DataReader("000001.SS", "yahoo",start,end)

        # 300005 探路者股票 深证

        data_tlz = DataReader("300005.SZ", "yahoo",start,end)

        data_ss.to_csv('000001.csv')

        data_tlz.to_csv('300005.csv')

    return data_ss, data_tlz

data_ss, data_tlz = load_data()

# 探路者与上证综指

close_ss = data_ss["Close"]

close_tlz = data_tlz["Close"]

# 将探路者与上证综指进行数据合并

stock = pd.merge(data_ss, data_tlz, left_index = True, right_index = True)

# print(stock.head())

stock = stock[["Close_x","Close_y"]]

stock.columns = ["上证综指","探路者"]

# 统计每日收益率

daily_return = (stock.diff()/stock.shift(periods = 1)).dropna()

print(daily_return.head())

# 找出当天收益率大于10%的,应该是没有,因为涨停为10%

print(daily_return[daily_return["探路者"] > 0.1])

# 每日收益率可视化

fig,ax = plt.subplots(nrows=1,ncols=2,figsize=(15,6))

daily_return["上证综指"].plot(ax=ax[0])

ax[0].set_title("上证综指")

daily_return["探路者"].plot(ax=ax[1])

ax[1].set_title("探路者")

plt.show()

# 散点图

fig,ax = plt.subplots(nrows=1,ncols=1,figsize=(12,6))

plt.scatter(daily_return["探路者"],daily_return["上证综指"])

plt.title("每日收益率散点图 from 探路者 & 上证综指")

plt.show()

# 回归分析

#statsmodels 中有现成的 OLS 线性回归模型,直接调用就能用😆,而且还有 summary() 函数直接查看训练结果!!!太好用了

import statsmodels.api as sm

# 加入截距项

daily_return["intercept"]=1.0

model = sm.OLS(daily_return["探路者"],daily_return[["上证综指","intercept"]])

results = model.fit()

print(results.summary())

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 【概述】 SVM训练分类器的方法是寻找到超平面,使正负样本在超平面的两侧(分类正确性即“分得开”),且样本到超平面...
    sealaes阅读 11,002评论 0 7
  • JavaScript使用 插入 引入外部的JavaScript代码 在页面中使用src属性引入外部文件 JavaS...
    小程的Bald_diary阅读 541评论 0 0
  • 在六月的夏季里西南部的天气越来越炎热,就只能待在家里吹着空调,反正也无是事就刷着手机里的贴子看看自己感兴趣的事情。...
    XL小君阅读 534评论 0 0
  • 吸引力法则90天线上打卡 1、朗读师父人生十大哲学分享:我的生命我负全责,我命由我不由天,要想获得成功,我的前途必...
    my_f4f2阅读 141评论 0 0
  • 皮皮洛洛阅读 116评论 0 0