机器学习——线性回归

机器学习——线性回归,第1张

西瓜书线性回归

为了加深理解,不用框架自己编程实现。
由于缺少数据,就自己创建一个数据。自定义一个一元线性函数,然后通过random创建一个围绕该直线波动的数据集。将函数写成西瓜书上的向量形式

import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import *

#一次函数
def ture_fun(x):
    return 1.75*x+1.5
    
#利用random选取40个围绕直线波动的数据  
np.random.seed(0)
x_train=np.sort(np.random.rand(40))

#ture_fun()函数的返回值+误差项并转化数组
y_train=(ture_fun(x_train)+np.random.randn(40)*0.05).reshape(40,1)

#改写向量,将误差项并入向量
x_data=[]
for i in x_train:
    x_data.append([i,1])
x_data=np.array(x_data)

#获取数组维度
m,n=np.shape(np.array(x_data))

数据集构造完成后就是利用梯度下降算出最优解。如果学过统计应该了解最小二乘法求一元线性回归模型的最佳参数,最小二乘法就是高数中的求多元函数的极值(最值)。它们对于损失函数的定义都是相同的–求得损失函数的最小值,使得假设函数能够更好的拟合训练集数据。但是最小二乘法是直接计算损失函数的极值,而梯度下降却是给定初始值,按照梯度一步步迭代的方式取得局部最小值,之后再选定其他初始值。

#迭代次数
maxiter=400
#权重向量
weights=np.ones((n,1))
#学习率
alpha=0.01
for i in range(0,maxiter):
    #one=x_data.dot(weights)
    #two=one-y_train
    #gradient=(x_data.T).dot(two)
    #梯度计算(梯度下降)
    gradient=(x_data.T).dot(x_data.dot(weights)-y_train)
    weights=weights-alpha*gradient

print("w的估计值为{},b的估计值为{}".format(weights[0:-1],weights[-1]))
#x轴上的数据点
x_lables=np.linspace(0,1,100)
#绘图看看拟合效果
#模型效果
plt.plot(x_lables,x_lables*weights[0][0]+weights[1],label="Model")
#真实函数图像
plt.plot(x_lables,train_fun(x_lables),label="true function")
plt.scatter(x_train,y_train)
plt.legend(loc="best")

对率回归

西瓜书课后习题编程实现对率回归。数据集

#对率回归
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import *
import pandas as pd

#读取数据集
data=pd.read_excel("watermelon.xlsx",index=False)
data=data[["密度","含糖率","好瓜"]]
#定义好瓜为1其他为0
data["好瓜"]=data["好瓜"].map({"是":1,"否":0})

#定义对率函数
def sigmoid(z):
    return 1/(1+np.exp(-z))
#获取向量形式
x_train=np.array(data[["密度","含糖率"]])
x_train=np.c_[x_train,np.ones(17)]
#分类结果
y_test=np.array(data["好瓜"])
y_test=y_test.reshape(-1,1)
m,n=x_train.shape


#同上述线性回归的梯度下降部分
maxiter=190
alpha=0.01
weights=np.ones((n,1))

for i in range(0,maxiter):
    z=1/(1+np.exp(-(x_train.dot(weights))))
    y_train=np.where(z>=0.5,1,0)
    #gradient=(-y_train*x_train.dot(weights)+np.log(1+np.exp(x_train.dot(weights)))).sum()
    gradient=((-(y_test-y_train)*x_train).sum(0)).reshape(-1,1)
    weights=weights-alpha*gradient


x=np.linspace(0,1,100)
plt.plot(x,-((weights[0,0]/weights[1,0])*x+weights[2,0]/weights[1,0]),label="line")
plt.scatter(data[data["好瓜"]==1].iloc[:,[0]],
            data[data["好瓜"]==1].iloc[:,[1]],marker="+",label="good")
plt.scatter(data[data["好瓜"]==0].iloc[:,[0]],
            data[data["好瓜"]==0].iloc[:,[1]],marker="x",c="r",label="bad")
plt.legend(loc="best")

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/790207.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存