机器学习-Ridge 岭回归

该博客介绍了岭回归算法的原理及其实现过程。通过Python的sklearn库展示了如何训练模型,并探讨了岭回归如何防止矩阵不可逆问题以及其对权重系数的惩罚作用。文章还提供了代码示例,展示如何在不同alpha值下调整模型并评估性能。
摘要由CSDN通过智能技术生成

前言:

     当alpha 值为0,求解过程和最小二乘法是一样的

优点:

   可以防止矩阵不可逆

   惩罚某个维度权重系数过高

一   岭回归原理

        输入:

               X[m,n]  m个样本,n个维度

               Y[m,1]: 标签值

      模型

              Y=Xw

             其中w 为权重系数 [n,1]

              

        求解:

             w

        算法推导

                L=\frac{1}{2}(Y-Xw)(Y-Xw)+\frac{1}{2}w^Tw\alpha

               对w 求导,分母形式

                -X^T(Y-Xw)+\alpha *w=0

                  X^TY=(X^TX+\alpha I)w

                   w= (X^TX+\alpha I)^{-1}X^TY

二 CODE

  

# -*- coding: utf-8 -*-
"""
Created on Thu Jul  8 17:05:06 2021

@author: chengxf2
"""
import numpy as np
from sklearn.metrics import mean_squared_error , r2_score
import matplotlib.pyplot as plt
class RidgeRegression():
    
    '''
    加载数据集
    '''
    def LoadData(self):
        
        f = open(self.name)
        
        lines = f.readlines()
        self.n = len(lines[0].split())-1
        
        dataMat =[]
        labelMat =[]
        for line in lines:
            items = line.split('\t')
            lineData =[]
            for i in range(self.n):
                val = float(items[i])
                lineData.append(val)
            dataMat.append(lineData)
            y = float(items[-1])
            labelMat.append(y)
            
        return np.mat(dataMat),np.mat(labelMat).T
    
    def Train(self, dataMat, labelMat,alpha=0.01):
        
        #print("\n step1 ",dataMat)
        xx = np.dot(dataMat.T,dataMat)
        #print("\n step2 ")
        A = xx+alpha*np.eye(self.n)
        
        if np.linalg.det(A) ==0.0: #矩阵不可逆
           #print("\n ===========error=========")
           return
        B =dataMat.T*labelMat
         
        W = np.linalg.inv(A)*B
         
        return W
    
    '''
    预测
    '''
    def Predict(self, W,dataMat):
        y_predict = dataMat*W
        
        return y_predict
    
    def Test(self):
         dataMat, labelMat =rd.LoadData()
         
         alpha = np.arange(0.001,1.2,0.001)
         y_score =[]
         
         for a in alpha:
            w = rd.Train(dataMat, labelMat, a)
            y_predict = rd.Predict(w, dataMat)
            score = r2_score(labelMat, y_predict)
            y_score.append(score)
            #print("\n score ",score)
         fig = plt.figure()
         ax = fig.add_subplot(111)
         ax.plot(alpha,y_score,'go-',linewidth=1,label="alpha-score")
         ax.legend()
  
            
            
        
       
    def __init__(self):
        
        self.m = 0 #样本个数
        self.n = 0 #样本维度
        self.name ="ex0.txt"

if __name__ =="__main__":
    rd = RidgeRegression()
    rd.Test()
   

             ​​​​​​

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值