第一部分
# 回归问题 回归曲线 --->预测
# 分类是有限的,回归是无限的
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)}")