1. 首页 > 科技快讯 >

numpy多元线性回归 多元线性回归的命令

您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!Seaborn是一个Python中用于创建信息丰富和有吸引力的统计图形库。这个库是基于matplotlib的。Seaborn提供多种功能,如内置主题、调色板、函数和工具,来实现单因素、双因素、线性回归、数据矩阵、统计时间序列等的可视化,以让我们来进一步构建复杂的可视化。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

numpy多元线性回归 多元线性回归的命令numpy多元线性回归 多元线性回归的命令


您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!Seaborn是一个Python中用于创建信息丰富和有吸引力的统计图形库。这个库是基于matplotlib的。Seaborn提供多种功能,如内置主题、调色板、函数和工具,来实现单因素、双因素、线性回归、数据矩阵、统计时间序列等的可视化,以让我们来进一步构建复杂的可视化。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!Seaborn是一个Python中用于创建信息丰富和有吸引力的统计图形库。这个库是基于matplotlib的。Seaborn提供多种功能,如内置主题、调色板、函数和工具,来实现单因素、双因素、线性回归、数据矩阵、统计时间序列等的可视化,以让我们来进一步构建复杂的可视化。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!Seaborn是一个Python中用于创建信息丰富和有吸引力的统计图形库。这个库是基于matplotlib的。Seaborn提供多种功能,如内置主题、调色板、函数和工具,来实现单因素、双因素、线性回归、数据矩阵、统计时间序列等的可视化,以让我们来进一步构建复杂的可视化。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

您好,你的问题,我之前好像也遇到过,以下是我原来的解决思路和方法,希望能帮助到你,若有错误,还望见谅!Seaborn是一个Python中用于创建信息丰富和有吸引力的统计图形库。这个库是基于matplotlib的。Seaborn提供多种功能,如内置主题、调色板、函数和工具,来实现单因素、双因素、线性回归、数据矩阵、统计时间序列等的可视化,以让我们来进一步构建复杂的可视化。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!

如何用Python进行线性回归以及误差分析

数据挖掘中的预测问题通常分为2类:回归与分类。

简单的说回归就是预测数值,而分类是给数据打上标签归类。

本文讲述如何用Python进行基本的数据拟合,以及如何对拟合结果的误差进行分析。

本例中使用一个2次函数加上随机的扰动来生成500个点,然后尝试用1、2、100次方的多项式对该数据进行拟合。

拟合的目的是使得根据训练数据能够拟合出一个多项式函数,这个函数能够很好的拟合现有数据,并且能对未知的数据进行预测。

代码如下:

importmatplotlib.pyplot as plt

importnumpy as np

importscipy as sp

fromscipy.stats importnorm

fromsklearn.pipeline importPipeline

fromsklearn.linear_model importLinearRegression

fromsklearn.preprocessing importPolynomialFeatures

fromsklearn importlinear_model

''''' 数据生成 '''

x = np.arange(0, 1, 0.002)

y = norm.rvs(0, size=500, scale=0.1)

y = y + x**2

''''' 均方误差根 '''

defrmse(y_test, y):

returnsp.sqrt(sp.mean((y_test - y) ** 2))

''''' 与均值相比的优秀程度,介于[0~1]。0表示不如均值。1表示完美预测.这个版本的实现是参考scikit-learn官网文档 '''

defR2(y_test, y_true):

return1- ((y_test - y_true)**2).sum() / ((y_true - y_true.mean())**2).sum()

''''' 这是Conway&White《机器学习使用案例解析》里的版本 '''

defR22(y_test, y_true):

y_mean = np.array(y_true)

y_mean[:] = y_mean.mean()

return1- rmse(y_test, y_true) / rmse(y_mean, y_true)

plt.scatter(x, y, s=5)

degree = [1,2,100]

y_test = []

y_test = np.array(y_test)

ford indegree:

clf = Pipeline([('poly', PolynomialFeatures(degree=d)),

('linear', LinearRegression(fit_intercept=False))])

clf.fit(x[:, np.newaxis], y)

y_test = clf.predict(x[:, np.newaxis])

print(clf.named_steps['linear'].coef_)

print('rmse=%.2f, R2=%.2f, R22=%.2f, clf.score=%.2f'%

(rmse(y_test, y),

R2(y_test, y),

R22(y_test, y),

clf.score(x[:, np.newaxis], y)))

plt.plot(x, y_test, linewidth=2)

plt.grid()

plt.legend(['1','2','100'], loc='upper left')

plt.show()

该程序运行的显示结果如下:

[-0.16140183 0.99268453]

rmse=0.13, R2=0.82, R22=0.58, clf.score=0.82

[ 0.00934527 -0.03591245 1.03065829]

rmse=0.11, R2=0.88, R22=0.66, clf.score=0.88

[ 6.07130354e-02 -1.02247150e+00 6.66972089e+01 -1.85696012e+04

......

-9.43408707e+12 -9.78954604e+12 -9.99872105e+12 -1.00742526e+13

-1.00303296e+13 -9.88198843e+12 -9.64452002e+12 -9.33298267e+12

-1.00580760e+12]

rmse=0.10, R2=0.89, R22=0.67, clf.score=0.89

显示出的coef_就是多项式参数。如1次拟合的结果为

y = 0.99268453x -0.16140183

这里我们要注意这几点:

1、误差分析。

做回归分析,常用的误差主要有均方误差根(RMSE)和R-平方(R2)。

RMSE是预测值与真实值的误差平方根的均值。这种度量方法很流行(Netflix机器学习比赛的评价方法),是一种定量的权衡方法。

R2方法是将预测值跟只使用均值的情况下相比,看能好多少。其区间通常在(0,1)之间。0表示还不如什么都不预测,直接取均值的情况,而1表示所有预测跟真实结果完美匹配的情况。

R2的计算方法,不同的文献稍微有不同。如本文中函数R2是依据scikit-learn官网文档实现的,跟clf.score函数结果一致。

而R22函数的实现来自Conway的著作《机器学习使用案例解析》,不同在于他用的是2个RMSE的比值来计算R2。

我们看到多项式次数为1的时候,虽然拟合的不太好,R2也能达到0.82。2次多项式提高到了0.88。而次数提高到100次,R2也只提高到了0.89。

2、过拟合。

使用100次方多项式做拟合,效果确实是高了一些,然而该模型的据测能力却极其差劲。

而且注意看多项式系数,出现了大量的大数值,甚至达到10的12次方。

这里我们修改代码,将500个样本中的最后2个从训练集中移除。然而在测试中却仍然测试所有500个样本。

clf.fit(x[:498, np.newaxis], y[:498])

这样修改后的多项式拟合结果如下:

[-0.17933531 1.0052037 ]

rmse=0.12, R2=0.85, R22=0.61, clf.score=0.85

[-0.01631935 0.01922011 0.99193521]

rmse=0.10, R2=0.90, R22=0.69, clf.score=0.90

...

rmse=0.21, R2=0.57, R22=0.34, clf.score=0.57

仅仅只是缺少了最后2个训练样本,红线(100次方多项式拟合结果)的预测发生了剧烈的偏差,R2也急剧下降到0.57。

而反观1,2次多项式的拟合结果,R2反而略微上升了。

这说明高次多项式过度拟合了训练数据,包括其中大量的噪音,导致其完全丧失了对数据趋势的预测能力。前面也看到,100次多项式拟合出的系数数值无比巨大。人们自然想到通过在拟合过程中限制这些系数数值的大小来避免生成这种畸形的拟合函数。

其基本原理是将拟合多项式的所有系数绝对值之和(L1正则化)或者平方和(L2正则化)加入到惩罚模型中,并指定一个惩罚力度因子w,来避免产生这种畸形系数。

这样的思想应用在了岭(Ridge)回归(使用L2正则化)、Lasso法(使用L1正则化)、弹性网(Elastic net,使用L1+L2正则化)等方法中,都能有效避免过拟合。

下面以岭回归为例看看100次多项式的拟合是否有效。将代码修改如下:

clf = Pipeline([('poly', PolynomialFeatures(degree=d)),

('linear', linear_model.Ridge())])

clf.fit(x[:400, np.newaxis], y[:400])

结果如下:

[ 0. 0.75873781]

rmse=0.15, R2=0.78, R22=0.53, clf.score=0.78

[ 0. 0.35936882 0.52392172]

rmse=0.11, R2=0.87, R22=0.64, clf.score=0.87

[ 0.00000000e+00 2.63903249e-01 3.14973328e-01 2.43389461e-01

1.67075328e-01 1.10674280e-01 7.30672237e-02 4.88605804e-02

......

3.70018540e-11 2.93631291e-11 2.32992690e-11 1.84860002e-11

1.46657377e-11]

rmse=0.10, R2=0.90, R22=0.68, clf.score=0.90

from sklearn import linear_model#线性回归clf = linear_model.LinearRegression()#训练clf.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])#表达式参数clf.coef_#测试improt numpy as npx = np.array([1,1])y = x.dot(clf.coef_)

十种常见排序算法一般分为以下几种:

(1)非线性时间比较类排序:

a. 交换类排序(快速排序、冒泡排序)

b. 插入类排序(简单插入排序、希尔排序)

c. 选择类排序(简单选择排序、堆排序)

d. 归并排序(二路归并排序、多路归并排序)

(2)线性时间非比较类排序:

a. 技术排序

b. 基数排序

c. 桶排序

总结:

(1)在比较类排序种,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始排序状态对堆排序不会产生太大的影响,而快速排序却恰恰相反。

(2)线性时间非比较类排序一般要优于非线性时间比较类排序,但前者对待排序元素的要求较为严格,比如计数排序要求待待排序数的最大值不能太大,桶排序要求元素按照hash分桶后桶内元素的数量要均匀。线性时间非比计较类排序的典型特点是以空间换时间。

您的问题有问题。

好比 “汉语有哪些简单的形容方法。”

算法是解决问题的思路 具体用代码写出来。跟计算机语言本身没啥关系。

本文中,我们将进行大量的编程——但在这之前,我们先介绍一下我们今天要解决的实例问题。

1) 预测房子价格

我们想预测特定房子的价值,预测依据是房屋面积。

2) 预测下周哪个电视节目会有更多的观众

闪电侠和绿箭侠是我最喜欢的电视节目。我想看看下周哪个节目会有更多的观众。

3) 替换数据集中的缺失值

我们经常要和带有缺失值的数据集打交道。这部分没有实战例子,不过我会教你怎么去用线性回归替换这些值。

所以,让我们投入编程吧(马上)

在动手之前,去把我以前的文章(Python Packages for Data Mining)中的程序包安装了是个好主意。

1) 预测房子价格

我们有下面的数据集:

输入编号

平方英尺

价格

1 150 6450

2 200 7450

3 250 8450

4 300 9450

5 350 11450

6 400 15450

7 600 18450

步骤:

在线性回归中,我们都知道必须在数据中找出一种线性关系,以使我们可以得到θ0和θ1。 我们的假设方程式如下所示:

其中: hθ(x)是关于特定平方英尺的价格值(我们要预测的值),(意思是价格是平方英尺的线性函数); θ0是一个常数; θ1是回归系数。

那么现在开始编程:

步骤1

打开你最喜爱的文本编辑器,并命名为predict_house_price.py。 我们在我们的程序中要用到下面的包,所以把下面代码复制到predict_house_price.py文件中去。

Python

12

34

5# Required Packages

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

from sklearn import datasets, linear_model

运行一下你的代码。如果你的程序没错,那步骤1基本做完了。如果你遇到了某些错误,这意味着你丢失了一些包,所以回头去看看包的页面。 安装博客文章中所有的包,再次运行你的代码。这次希望你不会遇到任何问题。

现在你的程序没错了,我们继续……

步骤2

Python

12

34

56

78

9# Function to get data

def get_data(file_name):

data = pd.read_csv(file_name)

X_parameter = []

Y_parameter = []

for single_square_feet ,single_price_value in zip(data['square_feet'],data['price']):

X_parameter.append([float(single_square_feet)])

Y_parameter.append(float(single_price_value))

return X_parameter,Y_parameter

第3行:将.csv数据读入Pandas数据帧。

第6-9行:把Pandas数据帧转换为X_parameter和Y_parameter数据,并返回他们。

所以,让我们把X_parameter和Y_parameter打印出来:

Python

12

3[[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]]

[6450.0, 7450.0, 8450.0, 9450.0, 11450.0, 15450.0, 18450.0]

[Finished in 0.7s]

脚本输出: [[150.0], [200.0], [250.0], [300.0], [350.0], [400.0], [600.0]] [6450.0, 7450.0, 8450.0, 9450.0, 11450.0, 15450.0, 18450.0] [Finished in 0.7s]

步骤3

现在让我们把X_parameter和Y_parameter拟合为线性回归模型。我们要写一个函数,输入为X_parameters、Y_parameter和你要预测的平方英尺值,返回θ0、θ1和预测出的价格值。

Python

12

34

56

78

910

11

12

# Function for Fitting our data to Linear model

def linear_model_main(X_parameters,Y_parameters,predict_value):

# Create linear regression object

regr = linear_model.LinearRegression()

regr.fit(X_parameters, Y_parameters)

predict_outcome = regr.predict(predict_value)

predictions = {}

predictions['intercept'] = regr.intercept_

predictions['coefficient'] = regr.coef_

predictions['predicted_value'] = predict_outcome

return predictions

第5-6行:首先,创建一个线性模型,用我们的X_parameters和Y_parameter训练它。

第8-12行:我们创建一个名称为predictions的字典,存着θ0、θ1和预测值,并返回predictions字典为输出。

所以让我们调用一下我们的函数,要预测的平方英尺值为700。

Python

12

34

56

X,Y = get_data('input_data.csv')

predictvalue = 700

result = linear_model_main(X,Y,predictvalue)

print "Intercept value " , result['intercept']

print "coefficient" , result['coefficient']

print "Predicted value: ",result['predicted_value']

脚本输出:Intercept value 1771.80851064 coefficient [ 28.77659574] Predicted value: [ 21915.42553191] [Finished in 0.7s]

这里,Intercept value(截距值)就是θ0的值,coefficient value(系数)就是θ1的值。 我们得到预测的价格值为21915.4255——意味着我们已经把预测房子价格的工作做完了!

为了验证,我们需要看看我们的数据怎么拟合线性回归。所以我们需要写一个函数,输入为X_parameters和Y_parameters,显示出数据拟合的直线。

Python

12

34

56

78

910

# Function to show the resutls of linear fit model

def show_linear_line(X_parameters,Y_parameters):

# Create linear regression object

regr = linear_model.LinearRegression()

regr.fit(X_parameters, Y_parameters)

plt.scatter(X_parameters,Y_parameters,color='blue')

plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)

plt.xticks(())

plt.yticks(())

plt.show()

那么调用一下show_linear_line函数吧:

Python

1show_linear_line(X,Y)

脚本输出:

2)预测下周哪个电视节目会有更多的观众

闪电侠是一部由剧作家/制片人Greg Berlanti、Andrew Kreisberg和Geoff Johns创作,由CW电视台播放的美国电视连续剧。它基于DC漫画角色闪电侠(Barry Allen),一个具有超人速度移动能力的装扮奇特的打击犯罪的超级英雄,这个角色是由Robert Kanigher、John Broome和Carmine Infantino创作。它是绿箭侠的衍生作品,存在于同一世界。该剧集的试播篇由Berlanti、Kreisberg和Johns写作,David Nutter执导。该剧集于2014年10月7日在北美首映,成为CW电视台收视率最高的电视节目。

绿箭侠是一部由剧作家/制片人 Greg Berlanti、Marc Guggenheim和Andrew Kreisberg创作的电视连续剧。它基于DC漫画角色绿箭侠,一个由Mort Weisinger和George Papp创作的装扮奇特的犯罪打击战士。它于2012年10月10日在北美首映,与2012年末开始全球播出。主要拍摄于Vancouver、British Columbia、Canada,该系列讲述了亿万花花公子Oliver Queen,由Stephen Amell扮演,被困在敌人的岛屿上五年之后,回到家乡打击犯罪和腐败,成为一名武器是弓箭的神秘义务警员。不像漫画书中,Queen最初没有使用化名”绿箭侠“。

由于这两个节目并列为我最喜爱的电视节目头衔,我一直想知道哪个节目更受其他人欢迎——谁会最终赢得这场收视率之战。 所以让我们写一个程序来预测哪个电视节目会有更多观众。 我们需要一个数据集,给出每一集的观众。幸运地,我从维基百科上得到了这个数据,并整理成一个.csv文件。它如下所示。

闪电侠

闪电侠美国观众数

绿箭侠

绿箭侠美国观众数

1 4.83 1 2.84

2 4.27 2 2.32

3 3.59 3 2.55

4 3.53 4 2.49

5 3.46 5 2.73

6 3.73 6 2.6

7 3.47 7 2.64

8 4.34 8 3.92

9 4.66 9 3.06

观众数以百万为单位。

解决问题的步骤:

首先我们需要把数据转换为X_parameters和Y_parameters,不过这里我们有两个X_parameters和Y_parameters。因此,把他们命名为flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter吧。然后我们需要把数据拟合为两个不同的线性回归模型——先是闪电侠,然后是绿箭侠。 接着我们需要预测两个电视节目下一集的观众数量。 然后我们可以比较结果,推测哪个节目会有更多观众。

步骤1

导入我们的程序包:

Python

12

34

56

7# Required Packages

import csv

import sys

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

from sklearn import datasets, linear_model

步骤2

写一个函数,把我们的数据集作为输入,返回flash_x_parameter、flash_y_parameter、arrow_x_parameter、arrow_y_parameter values。

Python

12

34

56

78

910

11

12

13

# Function to get data

def get_data(file_name):

data = pd.read_csv(file_name)

flash_x_parameter = []

flash_y_parameter = []

arrow_x_parameter = []

arrow_y_parameter = []

for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):

flash_x_parameter.append([float(x1)])

flash_y_parameter.append(float(y1))

arrow_x_parameter.append([float(x2)])

arrow_y_parameter.append(float(y2))

return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter

现在我们有了我们的参数,来写一个函数,用上面这些参数作为输入,给出一个输出,预测哪个节目会有更多观众。

Python

12

34

56

78

910

11

12

13

14

15

# Function to know which Tv show will have more viewers

def more_viewers(x1,y1,x2,y2):

regr1 = linear_model.LinearRegression()

regr1.fit(x1, y1)

predicted_value1 = regr1.predict(9)

print predicted_value1

regr2 = linear_model.LinearRegression()

regr2.fit(x2, y2)

predicted_value2 = regr2.predict(9)

#print predicted_value1

#print predicted_value2

if predicted_value1 > predicted_value2:

print "The Flash Tv Show will have more viewers for next week"

else:

print "Arrow Tv Show will have more viewers for next week"

把所有东西写在一个文件中。打开你的编辑器,把它命名为prediction.py,复制下面的代码到prediction.py中。

Python

12

34

56

78

910

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

# Required Packages

import csv

import sys

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

from sklearn import datasets, linear_model

# Function to get data

def get_data(file_name):

data = pd.read_csv(file_name)

flash_x_parameter = []

flash_y_parameter = []

arrow_x_parameter = []

arrow_y_parameter = []

for x1,y1,x2,y2 in zip(data['flash_episode_number'],data['flash_us_viewers'],data['arrow_episode_number'],data['arrow_us_viewers']):

flash_x_parameter.append([float(x1)])

flash_y_parameter.append(float(y1))

arrow_x_parameter.append([float(x2)])

arrow_y_parameter.append(float(y2))

return flash_x_parameter,flash_y_parameter,arrow_x_parameter,arrow_y_parameter

# Function to know which Tv show will have more viewers

def more_viewers(x1,y1,x2,y2):

regr1 = linear_model.LinearRegression()

regr1.fit(x1, y1)

predicted_value1 = regr1.predict(9)

print predicted_value1

regr2 = linear_model.LinearRegression()

regr2.fit(x2, y2)

predicted_value2 = regr2.predict(9)

#print predicted_value1

#print predicted_value2

if predicted_value1 > predicted_value2:

print "The Flash Tv Show will have more viewers for next week"

else:

print "Arrow Tv Show will have more viewers for next week"

x1,y1,x2,y2 = get_data('input_data.csv')

#print x1,y1,x2,y2

more_viewers(x1,y1,x2,y2)

可能你能猜出哪个节目会有更多观众——但运行一下这个程序看看你猜的对不对。

3) 替换数据集中的缺失值

有时候,我们会遇到需要分析包含有缺失值的数据的情况。有些人会把这些缺失值舍去,接着分析;有些人会用最大值、最小值或平均值替换他们。平均值是三者中最好的,但可以用线性回归来有效地替换那些缺失值。

这种方法差不多像这样进行。

首先我们找到我们要替换那一列里的缺失值,并找出缺失值依赖于其他列的哪些数据。把缺失值那一列作为Y_parameters,把缺失值更依赖的那些列作为X_parameters,并把这些数据拟合为线性回归模型。现在就可以用缺失值更依赖的那些列预测缺失的那一列。

一旦这个过程完成了,我们就得到了没有任何缺失值的数据,供我们自由地分析数据。

为了练习,我会把这个问题留给你,所以请从网上获取一些缺失值数据,解决这个问题。一旦你完成了请留下你的评论。我很想看看你的结果。

个人小笔记:

我想分享我个人的数据挖掘经历。记得在我的数据挖掘引论课程上,教师开始很慢,解释了一些数据挖掘可以应用的领域以及一些基本概念。然后突然地,难度迅速上升。这令我的一些同学感到非常沮丧,被这个课程吓到,终于扼杀了他们对数据挖掘的兴趣。所以我想避免在我的博客文章中这样做。我想让事情更轻松随意。因此我尝试用有趣的例子,来使读者更舒服地学习,而不是感到无聊或被吓到。

谢谢读到这里——请在评论框里留下你的问题或建议,我很乐意回复你。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息