《封号码罗》数据分析与人工智能之sklearn回归问题(八)

第一部分

# 回归问题  回归曲线  --->预测
# 分类是有限的,回归是无限的
import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier  # 分类问题
from sklearn.neighbors import KNeighborsRegressor  # 回归问题
import matplotlib.pyplot as plt
import time

# x和y之间的关系是线性的
x = np.array([0, 1, 2, 3, 4])
y = np.array([1, 3, 5, 7, 9])
plt.plot(x, y)
plt.show()

# f = lambda x: 2 * x + 1   # f(x) = 2x + 1   # 回归要解决的问题就是解方程

# 线性回归 关键词就是最小二乘法,线性
# 普通线性回归
# 方程推导
# x + y + z = 3
# 2x + y - z = 3
# 3x -y + 4z = 6
# X = np.array([[1, 1, 1], [2, 1, 1 - 1], [3, -1, 4]])  # 方程的系数组成的数组
# w = [x, y, z] # 未知数组成的数组
# f = (y - Xw) ** 2     # 求解f的最小值,二元方程一定是大于0的
# X数据,y是目标值,此时两者都是已知数据
# 未知数据是w,二元一次方程
# 当导数为0 ----- 方程对应的函数值越小
# 令导数等于g
# g = 2 * (y - Xw) * (-X)
# 0 = (y - Xw) * X
# 方程左边乘以X的逆矩阵X_inv
# 0 = y - Xw
Xw = y  # 两边都乘以X的逆矩阵,但是求解逆矩阵必须是方阵,如size=(4,4)
#         一个非方阵的矩阵变成转置矩阵(X.T)之后乘以自身X,它就会变成一个方阵,这个时候就可以求解逆矩阵了
# X.T是转置矩阵   A.dot(X.T) 矩阵本身乘以转置矩阵 = 方阵矩阵


start = time.perf_counter()
# print(X_train, "\n", X_test, "\n", y_train, "\n", y_test)
print()
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")

第二部分

import numpy as np
import pandas as pd
from sklearn.neighbors import KNeighborsClassifier  # 分类问题
from sklearn.neighbors import KNeighborsRegressor  # 回归问题
import matplotlib.pyplot as plt
import time
# 预测波士顿房价
import sklearn.datasets as datasets

# 导入波士顿房价数据,这个是库本身提供的数据
data = datasets.load_boston()

# 糖尿病数据
# data = datasets.load_diabetes()

# print(data)  # 里面有data是数据,target是房价
X = data["data"]  # 获得数据
# print(X.shape)  # (506, 13),506个样本,13个列属性
y = data["target"]
# print(y.shape)  # (506,)
shuxing = data["feature_names"]
#                 犯罪率 居住面积 商业 chas河  环境
# print(shuxing)  # ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO''B' 'LSTAT']
# 回归问题 就是通过数据让Xw=y之间建立一个合适的方程
from sklearn.linear_model import LinearRegression  # 线性回归
from sklearn.model_selection import train_test_split

# 声明一个线性模型对象    下面这个粒子是不包含截距的b_
#                       normalize=False是否数据归一化
lr = LinearRegression(fit_intercept=False)  # 模型里面是否计算方程截距
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1)  # 百分之一的测试数据
lr.fit(X_train, y_train)  # 算法训练模型
s1 = lr.predict(X_test).round(2)  # 模型预测结果  算法就可以提供建议和参考

w_ = lr.coef_  # 13个未知数的值   coefficient缩写  [ˌkoʊɪˈfɪʃnt]
#                               n.	系数; (测定物质某种特性的) 系数
print(w_)
# 通过lr.fit(X_train, y_train)计算出来了w_,就是对w__这一行的一个封装
#       逆矩阵       测试数据.T(转置矩阵)
# w__ = np.linalg.inv(X_train.T.dot(X_train)).dot(X_train.T).dot(y_train)
# print(w__)

# print(w_, "\n", w_.shape)   # 一个列表 和 (13,)
# 列表中有13个数据,原来数据有506样本,13列属性,就相当于506个13元一次方程
# 现在w_返回的列表,就是这些方程通用的未知数的值
b_ = lr.intercept_  # b_ == bias 偏差的意思,这里是方程截距    如果fit_intercept=False,此时截距为0,模型就没有计算截距
# 算法解出来的方程是
# f(X) = Xw_ + b_
# 预测X_test
# res = X_test.dot(w_).round(2) # 等于 s1 = lr.predict(X_test).round(2)
# print(res)


start = time.perf_counter()
# print(s1)  # 预测数据
# print("-" * 100)
# print(y_test)  # 真实数据
end = time.perf_counter()
print(f"程序运行耗时为{(start - end).__round__(20)}")


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值