python 编程 线性回归,散点图,拟合结果,预测

把以下数据制作成csv数据文件,并命名为LR_data_exam.csv。 对该文件内的数据进行线性回归 画出数据的散点图 建立线性回归模型并拟合 打印拟合结果(参数) 画出数据和拟合直线的图 用model.predict预测x为10,20,30时的结果 用拟合参数预测x为40,50,60时的结果 battery,KM 2,12 5,31 8,45 8,52 13,79 15,85 17,115 19,119 21,135 24,145

import numpy as np
import csv
import matplotlib.pyplot as plt
class MLR:
    def __init__(self,x,y,intercept=True):
        self.x=x
        self.y=y
        self.ic=intercept
    def fit(self):
        if self.ic:
            ones=np.ones(self.x.shape)
            X=np.c_[ones,self.x]
        else:
            X=self.x
        y=self.y
        self.a=np.linalg.inv(X.T@X)@X.T@y
    def predict(self,x_new):
        if self.ic:
           ones=np.ones(x_new.shape)
           x=np.c_[ones,x_new] 
        else:
            x=x_new
        y=x @ self.a
        return y

            
data=np.loadtxt('LR_data_exam.csv', delimiter=',', skiprows=1)
x=data[:,0:-1]
y=data[:,-1:]
model = MLR(x,y)
model.fit() #回归
k = float(model.a[1])
b = float(model.a[0])

plt.scatter(x,y)
t = np.linspace(0,25,100)
plt.plot(t, k*t+b)
plt.show()
print("斜率:{}\n截距:{}".format(k,b))

print(model.predict(np.array([10,20,30])).flatten())
print(k*np.array([40,50,60])+b)

img

import numpy as np
import csv
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']=['sans-serif']
data = '''battery,KM
   2,12
   5,31
   8,45
   8,52
   13,79
   15,85
   17,115
   19,119
   21,135
   24,145'''.split('\n')
for i,j in enumerate(data):
    data[i] = j.replace(' ', '').split(',')
with  open('LR_data_exam.csv','w') as csvFile: #一行一行地写入到csv文件中
    writer = csv.writer(csvFile)
    #先写columns_name
    writer.writerow(data[0])
    #写入多行用writerows
    writer.writerows(data[1:])

LR_data_exam.csv:

dataframe = pd.read_csv("LR_data_exam.csv", sep=",") x = dataframe['battery'].tolist() y = dataframe['KM'].tolist()

画出数据的散点图

fig = plt.figure() fig.set_size_inches(10, 4) # 整个绘图区域的宽度10和高度4 ax = fig.add_subplot(1, 2, 1) # 整个绘图区分成一行两列,当前图是第一个。

画出原始数据的散点图。

ax.set_title("散点图") ax.set_xlabel("battery") ax.set_ylabel("KM") ax.scatter(x, y) plt.show()

regressor = LinearRegression() regressor = regressor.fit(np.reshape(x,(-1, 1)),np.reshape(y,(-1, 1))) print(regressor.coef_, regressor.intercept_) # 打印拟合结果(参数) [[6.28763667]] [-1.19680404]

画出数据和拟合直线的图

plt.scatter(x, y) plt.plot(np.reshape(x,(-1,1)), regressor.predict(np.reshape(x,(-1,1)))) plt.xlabel("battery") plt.ylabel("KM") plt.title("拟合结果") plt.show()

print(regressor.predict([[10], [20], [30]])) # model.predict预测x为10,20,30时的结果 for i in [40,50,60]: print(regressor.coef_*i + regressor.intercept_) #用拟合参数预测x为40,50,60时的结果 [[ 61.67956266] [124.55592935] [187.43229605]] [[250.30866274]] [[313.18502944]] [[376.06139613]]

import numpy as np
import csv
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family']=['sans-serif']
data = '''battery,KM
   2,12
   5,31
   8,45
   8,52
   13,79
   15,85
   17,115
   19,119
   21,135
   24,145'''.split('\n')
for i,j in enumerate(data):
    data[i] = j.replace(' ', '').split(',')
with  open('LR_data_exam.csv','w') as csvFile: #一行一行地写入到csv文件中
    writer = csv.writer(csvFile)
    #先写columns_name
    writer.writerow(data[0])
    #写入多行用writerows
    writer.writerows(data[1:])

LR_data_exam.csv:

img

dataframe = pd.read_csv("LR_data_exam.csv", sep=",")
x = dataframe['battery'].tolist()
y = dataframe['KM'].tolist()
# 画出数据的散点图
fig = plt.figure()
fig.set_size_inches(10, 4)   # 整个绘图区域的宽度10和高度4
ax = fig.add_subplot(1, 2, 1)  # 整个绘图区分成一行两列,当前图是第一个。
# 画出原始数据的散点图。
ax.set_title("散点图")
ax.set_xlabel("battery")
ax.set_ylabel("KM")
ax.scatter(x, y)
plt.show()

img

regressor = LinearRegression()
regressor = regressor.fit(np.reshape(x,(-1, 1)),np.reshape(y,(-1, 1)))
print(regressor.coef_, regressor.intercept_)  # 打印拟合结果(参数)
# 画出数据和拟合直线的图
plt.scatter(x, y)
plt.plot(np.reshape(x,(-1,1)), regressor.predict(np.reshape(x,(-1,1))))
plt.xlabel("battery") 
plt.ylabel("KM") 
plt.title("拟合结果")
plt.show()

img

print(regressor.predict([[10], [20], [30]]))  # model.predict预测x为10,20,30时的结果
for i in [40,50,60]:
    print(regressor.coef_*i + regressor.intercept_)   #用拟合参数预测x为40,50,60时的结果
[[ 61.67956266]
 [124.55592935]
 [187.43229605]]
[[250.30866274]]
[[313.18502944]]
[[376.06139613]]