机器学习之线性回归(python)

目录

一、基本概念

二、概念的数学形式表达

三、确定w和b

1.读取或输入数据

2.归一化、标准化

2.1 均值

2.2 归一化

2.3 标准化

3.求解w和b

1.直接解方程

2.最小二乘法(least square method)求解:

4. 评估回归模型

四、sklearn中的线性回归

1.对数据进行解析

2.对原始值和预测值进行绘图

3.绘制残差图


一、基本概念

线性(linear):

指量与量之间按比例、成直线的关系,在空间和时间上代表规则和光滑的运动,一阶导数为常数

非线性(non-linear):

指不按比例、不成直线的关系,代表不规则的运动和突变,一阶导数不为常数。

一个线性的例子:

数据:工资和年龄(2个特征)

目标:预测银行会贷款给我多少钱(标签)

考虑:工资和年龄都会影响最终银行贷款的结果,那么他们各自有多大的影响呢?(参数)

通俗的解释

x1,x2就是我们的两个特征(年龄、工资),y是银行最终会借给我们多少钱

找到最合适的一条线(想象一个高维)来最好的拟合我们的数据点

数学形式来了

二、概念的数学形式表达

给定数据集

数据的矩阵形式:

 线性模型(linear model)试图学得一个通过属性组合的线性组合来进行预测的函数,即

向量形式写成:   

线性回归(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记

三、确定w和b

对离散属性

若属性间存在“序”关系,可通过连续化将其转化为连续值。

若属性间不存在“序”关系,则转化为k维向量。

1.读取或输入数据

#导入相关库 numpy pandas
import pandas 
import numpy
#如果没有请安装哦,如下
# pip install pandas 
# pip install numpy

有库了,我们才可以导入数据哇

首先我们先看看csv数据的导入

import pandas as pd文件
data = pd.read_csv(r'路径', encoding='gbk')
#读取csv数据方式 pd.read_csv
# encoding='gbk' 定义编码方式 常用只有两种 utf8 和 gbk 按需定义即可#下面这种读取是显示没有第一列的数据 index_col=0 python中第0列也就是实际的第1列
#reset_index(drop=True)  True表示执行此删除命令
data= pd.read_csv(r"路径", encoding='gbk', index_col=0).reset_index(drop=True)

 读取数据后得分出和为X,何为Y

X = data.iloc[:,0:4]  # 0到3列所有的数据也就是实际的1到4列
Y = data.iloc[:, 5]  # 第5列所有的数据也就是实际的第6列

 接下来我们看看自己建立矩阵的数据读取方式

import numpy as np
a = np.array([1,2,3])
print(a)
b = np.array([[1,2],[2,3]])
print(b)

返回:

 

 说到矩阵了,就顺便说一下

创建矩阵的相关知识:mat()           创建矩阵array()         将列表转换为数组,可选择显式指定dtypearange()        range的numpy版,支持浮点数linspace()      类似arange(),第三个参数为数组长度zeros()         根据指定形状和dtype创建全0数组ones()          根据指定形状和dtype创建全1数组empty()         根据指定形状和dtype创建空数组(随机值)eye()           根据指定边长和dtype创建单位矩阵

2.归一化、标准化

2.1 均值

# 在这里我们可以直接用numpy中的mean函数计算
numpy。mean()

顺便介绍一下其他的numpy中的相关常用函数:
sum 求和
cumsum 求前缀和
mean 求平均数
std 求标准差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引

 要想确定w和b,首先要视情况决定是否需要对数据进行归一化或标准化

2.2 归一化

#范围归一化 此方法只适用一维数据
import numpy as np
data = np.asarray([1,5,3,8,4])
for x in data:x = float(x - np.min(data))/(np.max(data)- np.min(data))print(x)
# sklearn中的范围归一化函数MinMaxScaler函数可适用多维数据
from sklearn import preprocessing   
import numpy as np  X = np.array([[ 1., -1.,  2.],  [ 2.,  0.,  0.],  [ 0.,  1., -1.]])  min_max_scaler = preprocessing.MinMaxScaler()  
x = min_max_scaler.fit_transform(X)

2.3 标准化

#标准化
import numpy as npcc = np.array([[1,2,3],[4,5,6]]) #创建矩阵
print(cc) #输出矩阵cc_mean = np.mean(cc, axis=0)  #axis=0,表示按列求均值 ——— 即第一维,每一列可看做一个维度或者特征
cc_std = np.std(cc, axis=0) #xis=0,表示按列求标准差
cc_zscore = (cc-cc_mean)/cc_std   #直接计算,对数组进行标准化,一定要注意维度
print(cc_zscore) #输出结果
#sklearn中的标准化
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()        
cc_zscore = scaler.fit_transform(cc)
print(cc_zscore) #输出结果

3.求解w和b

1.直接解方程

N = data.shape[0]
X_mean = np.mean(X) #求均值
X_mean = np.array(X_mean) #转为数组
Y_mean = np.mean(Y) #求均值
Y_mean = np.array(Y_mean) #转为数组A = np.dot(X.T,X)-N*np.dot(X_mean.T,X_mean)
C = np.dot(X.T,Y)-N*np.dot(X_mean.T,Y_mean)
B = np.dot(np.linalg.inv(A),C) #系数
BB = Y_mean - np.dot(X_mean,B.T) #常数
YY = np.dot(X,B.T)+BB #Y的估计值

2.最小二乘法(least square method)求解:

把数据集D表示为一个m*(d+1)大小的矩阵X,其中每行对应于一个示例,改行前d个元素对应于示例的d个属性值,最好一个元素恒置为1,即

x = np.array([[1,5,8],[2,5,8],[1,4,6]])
Y = np.array([2,5,3])
b = np.ones(3)
X = np.insert(x, 3, values=b, axis=1)

当X^TX 为满秩矩阵(full-rank matrix) 或正走矩阵(positive definite matrix) 时,令

得到

w=np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)),X.T),Y)

 其中(X^TX)^-l是矩阵(X^TX)的逆矩阵.xi = (xi ,l) ,则最终学得的多元线性回归模型为

4. 评估回归模型

#离差平方和
S = np.var(Y)
#回归平方和
U = np.var(YY)
#剩余平方和
Q = S - U
#复可决系数
R2 = U/S
#负相关系数
R = np.sqrt(U/S)
#回归均方
# n= X_mean 的个数
UU = U/n
#剩余均方
# N= Y的个数
QQ = Q/(N-n-1)
#剩余标准差
s = np.sqrt(QQ)
#方程显著性检验值
F = UU/QQ

四、sklearn中的线性回归

1.对数据进行解析

from sklearn import linear_model
import numpy as np
import pandas as pd
#使用最小二乘线性回归进行拟合,导入相应的模块
lr=linear_model.LinearRegression()
data = pd.read_csv(r'D:\桌面\A.csv', encoding='gbk')
X = data.iloc[:,0:4]  
Y = data.iloc[:, 5]  
X_train,X_test,Y_train,Y_test=train_test_split(X, Y, test_size=0.2, random_state=0)
lr.fit(X_train,Y_train)  #拟合
y=lr.predict(X)       #得到预测值集合y
coef=lr.coef_                #获得该回该方程的回归系数与截距
intercept=lr.intercept_
print("预测方程回归系数:",coef)
print("预测方程截距:",intercept)
score=lr.score(X_test,Y_test)    #对得到的模型打分
print('模型的预测分',score)

2.对原始值和预测值进行绘图

from matplotlib import pyplot as plt
plt.plot(range(1,len(Y)+1),Y)
plt.plot(range(1,len(Y)+1),y)
plt.show()

3.绘制残差图

err = y - Y #求残差
plt.plot(range(1,len(Y)+1),err)
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言函数的调用

函数调用(Function Call),就是使用已经定义好的函数。 函数调用的一般形式为: functionName(param1, param2, param3 ...);functionName 是函数名称,param1, param2, param3 …是实参列表。实参可以是常数、变量、表…

机器学习之线性回归(matlab)

目录 一、基本概念 二、概念的数学形式表达 三、确定w和b 1.读取或输入数据 2.归一化、标准化 2.1 均值 2.2 归一化 2.3 标准化 3.求解w和b 1.直接解方程 2.最小二乘法(least square method)求解: 4. 评估回归模型 四、regress线…

C语言函数声明以及函数原型

C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。 函数声明(Declaration),就是告诉编译…

python(20)之读写文件

目录 读写文件 1.简单介绍 2.从文件中读取单行数据 3.从文件中读取多行 4.把 string(字符串) 的内容写入文件 5.写入其他类型的对象 本节知识总结 mode 参数 file 对象 读写文件 1.简单介绍 最常用的参数有两个: open(filename, mode) f op…

C语言全局变量和局部变量深入

局部变量 定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。 示例 int f1(int a){int b,c; //a,b,c仅在函数f1()内有效return abc; } int ma…

python实例之 67,68

目录 67.题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。 68.题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数 今天这个不知道…

C语言块级变量

代码块,就是由{ }包围起来的代码。代码块在C语言中随处可见,例如函数体、选择结构、循环结构等。不包含代码块的C语言程序根本不能运行,即使最简单的C语言程序也要包含代码块。 C语言允许在代码块内部定义变量,这样的变量具有块级…

python实例 69,70

69.题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 先看一下第一种实现方式 nmax 50 n int(input(请输入总人数:)) num [] f…

C语言递归调用

一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。 递归函数不是C语言的专利,Java…

python实例 71,72

目录 71.编写input()和output()函数输入,输出5个学生的数据记录。 72.题目:创建一个列表。 71.编写input()和output()函数输入,输出5个学生的数据记录。 #71 N 3 #stu # num : string # name : string # score[4]: list student [] for i…

Dev-C++ 常用快捷键大全

最近开始用Dev-C在Window下编程,感觉Dec-C是一款挺不错的C编译器。我总结了一些使用技巧。 Dev-C 的一些常用快捷键 恢复 CtrlZ 重做 CtrlY 剪切 CtrlX 拷贝 CtrlC 粘贴 CtrlV 搜索替换内容 CtrlF 选择全部 CtrlA 编译 F9 运行 F10 编译运行 F11 设置注释 Ctrl/…

python实例 73,74

目录 73.题目:反向输出一个链表。 74.题目:列表排序及连接。 73.题目:反向输出一个链表。 #73 ptr [] for i in range(5):num int(input(请输入一个数字:))ptr.append(num) print (输入原顺序列表,ptr) ptr.reverse() print (输入反顺序…

C语言简单计算器

用C语言实现简单的计算器功能。 简单计算器,实现简单的加减乘除功能,选择对应的运算符输出运算符对应的编号,然后输入我们要计算的两个数,程序会给出计算结果。 效果演示 简单计算器代码 /* 简单计算器 name:zsh */ #include…

python实例 75,76

目录 75.判断情人节 76. 题目:编写一个函数,输入n为偶数时,调用函数求1/21/4...1/n,当输入n为奇数时,调用函数1/11/3...1/n 75.判断情人节 #75 import timeif __name____main__:datetime.strftime(%m-%d,time.localtime())if d…

python实例 77,78

目录 77.题目:循环输出列表 78.找到年龄最大的人,并输出。 77.题目:循环输出列表 #77 s ["man","woman","girl","boy","sister"] for i in s:print(i) 返回: 或者是 s …

python实例 79,80

目录 79.字符串排序 80.猴子分桃 79.字符串排序 #79 list1[] str1input(请输入第一个字符串:) str2input(请输入第二个字符串:) str3input(请输入第三个字符串:) list1.extend([str1,str2,str3]) list1.sort() print (排序后的字符串为&am…

C语言带参数的宏定义

C语言允许宏带有参数。在宏定义中的参数称为“形式参数”,在宏调用中的参数称为“实际参数”,这点和函数有些类似。 对带参数的宏,在展开过程中不仅要进行字符串替换,还要用实参去替换形参。 带参宏定义的一般形式为&#xff1a…

python实例 81,82

目录 81.题目:809*??800*??9*?? 其中??代表的两位数, 809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。 82.题目:八进制转换为十进制 81.题目&#xf…

C语言带参宏定义和函数的区别

带参数的宏和函数区别: 宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理掉了,它没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会给它分配内…

python实例 83,84

目录 83.题目:求0—7所能组成的奇数个数。 84.题目:连接字符串 83.题目:求0—7所能组成的奇数个数。 程序分析: 组成1位数是4个。 组成2位数是7*4个。 组成3位数是7*8*4个。 组成4位数是7*8*8*4个。 ...... #83 sum 0 …