单变量线性回归-code

1、导入库

import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

#sklearn随机生成数据包
from sklearn.datasets.samples_generator import make_regression

2、随机生成数据

# X为样本特征,y为样本输出, coef为回归系数,随机生成30个样本,每个样本1个特征
X, Y, coef =make_regression(n_samples=30, n_features=1,noise=10, coef=True)

plt.scatter(X, Y,  color='black')# 画散点图
plt.plot(X, X*coef, color='blue',linewidth=3)# 画回归线
plt.show()

在这里插入图片描述

3、算术法

  • 3.1、梯度下降法

import random

def gradient_descent(alpha, x, y, ep=0.0001, max_iter=10000):
    converged = False
    iter = 0
    m = x.shape[0]  # 数据的行数

    # 初始化参数(theta)
    t0 = np.random.random(x.shape[1])
    t1 = np.random.random(x.shape[1])

    # 代价函数, J(theta)
    J = sum([(t0 + t1 * x[i] - y[i]) ** 2 for i in range(m)])

    # 进行迭代
    while not converged:
        # 计算训练集中每一行数据的梯度 (d/d_theta j(theta))
        grad0 = 1.0 / m * sum([(t0 + t1 * x[i] - y[i]) for i in range(m)])
        grad1 = 1.0 / m * sum([(t0 + t1 * x[i] - y[i]) * x[i] for i in range(m)])

        # 更新参数 theta
        # 此处注意,参数要同时进行更新,所以要建立临时变量来传值
        temp0 = t0 - alpha * grad0
        temp1 = t1 - alpha * grad1
        t0 = temp0
        t1 = temp1

        # 均方误差 (MSE)
        e = sum([(t0 + t1 * x[i] - y[i]) ** 2 for i in range(m)])

        if abs(J - e) <= ep:
            print('Converged, iterations: ', iter, '!!!')
            converged = True

        J = e  # 更新误差值
        iter += 1  # 更新迭代次数

        if iter == max_iter:
            print('Max interactions exceeded!')
            converged = True

    return t0, t1

4、向量法(即直接调用函数)


#拆分训练集和测试集(train_test_split是sklearn中的函数)
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,train_size=0.7)

#train为训练数据,test为测试数据,train_size 规定了训练数据的占比
print("自变量---源数据:",X.shape, ";  训练集:",X_train.shape, ";  测试集:",X_test.shape)
print("因变量---源数据:",Y.shape, ";  训练集:",Y_train.shape, ";  测试集:",Y_test.shape)

#调用线性回归函数
model = LinearRegression()

#线性回归训练
model.fit(X_train,Y_train)
a  = model.intercept_#截距
b = model.coef_#回归系数

#训练数据的预测值
y_train_pred = model.predict(X_train)

#绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
plt.plot(X_train, y_train_pred, color='blue', linewidth=2, label="best line")

#测试数据散点图
plt.scatter(X_train, Y_train, color='darkgreen', label="train data")
plt.scatter(X_test, Y_test, color='red', label="test data")

#添加图标标签
plt.legend(loc=2)#图标位于左上角,即第2象限,类似的,1为右上角,3为左下角,4为右下角
plt.show()#显示图像

print("拟合参数:截距",a,",回归系数:",b)

#显示线性方程,并限制参数的小数位为两位
print("最佳拟合线: Y = ",round(a,2),"+",round(b[0],2),"* X")


在这里插入图片描述

  • 拟合参数:截距 0.08738783891391932 ,回归系数: [84.43692823]
  • 最佳拟合线: Y = 0.09 + 84.44 * X

5、算术法与向量法比较

  • Sklearn 是基于Python的机器学习工具模块。里面主要包含了6大模块:分类、回归、聚类、降维、模型选择、预处理
  • 根据Sklearn 官方文档资料,下面将各个模块中常用的模型函数总结出来。

回归及分类(监督学习)

1.1 广义线性模型 (fromsklearn import linear_model)
  • 最小二乘法:拟合一个线性模型, 使得数据集实际观测数据和预测数据(估计值)之间残差平方和最小。
    clf=linear_model.LinearRegression(), clf.fit(X,y)
  • 岭回归:改良的最小二乘,解决共线问题。
    clf=linear_model.Ridge(alpha=0.5),clf.fit(X,y)
  • 逻辑回归:clf=linear_model.LogisticRegression()
1.2 朴素贝叶斯
  • 高斯模型: from sklearn.naive_bayes import GassianNB
    Gnb=GassianNB(),gnb.fit(data, target).predict(data)
  • 多项式模型:MultinomialNB
  • 伯努利模型:会把输入数据二元化BernoulliNB
1.3 决策树 from sklearn import tree
  • 决策树分类器:clf=tree.DecisionTreeClassifier()
  • 回归分类器(y 值为float非int):
    clf=tree. DecisionTreeRegressor()
1.4 支持向量机
from sklearn import svm
clf=svm.SVC()
1.5聚类
  • K-means:
from sklearn.cluster import KMeans
kmeans= KMeans(n_clusters=2, random_state=0).fit(X)

基于Sklearn库能够更快的得出我们所需得数据,因为它包含了机器学习的各个模块,能够简单方便的处理数据,它拥有高性能的有点,但在算术法中,性能较低,但是所有的分析都是比较全面,在机器学习这一块,需要将两种模式结合,才能得出最优解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值