[머신 러닝의 기초] 선형 회귀 모델은 B 스테이션의 동영상 좋아요 수와 컬렉션 간의 관계를 예측합니다.

선형 회귀 모델은 비디오 좋아요 수와 방송국 B (Hua Nong Brothers) 컬렉션 간의 관계를 예측합니다.


머리말

선형 회귀 모델을 사용하여 데이터 추세를 예측할 수 있습니다. 기존 데이터 세트의 훈련을 통해 선형 함수 Y = w * X + b 를 얻을 수 있으며이 선형 함수를 통해 후속 값을 예측할 수 있습니다.


1. 선형 회귀 모델

선형 회귀는 목표 값 X고유 값 Y 사이의 선형 상관 가정을 기반으로합니다 . 선형 모델
선형 함수
알려진 데이터 세트를 통해 해결 됩니다 . 구체적인 솔루션 방법은 손실 함수를 구성하여 손실 함수의 값을 점점 더 많이 만드는 것입니다. 정확도 요구 사항이나 반복 횟수가 충족 될 때까지 작아집니다. 손실 함수는 예측값과 실제 값의 차이를 구한 종류의 계산 과정의 실제 값과의 차이 로 이해 될 수 있으므로 , 실제 값을 가진 모델과 같은 차이가 작습니다 . 손실 함수 정의 : 손실 함수
손실 기능
를 최소화하려면 Loss (w, b) 를 최소화하십시오 . 경사 하강 법 알고리즘을 도입하면 경사 방향을 따라 하강하는 속도가 가장 빠릅니다. 요구 사항이 충족 될 때까지 각 반복 에서 wb를 업데이트 합니다. w 및 b에 대해 각각 Loss (w, b) 의 편미분을
경사 하강 법
계산 합니다 ( y = w * x + b 를 loss 함수로 가져올 수 있음 ).
w 편미분
b 부분 납

둘째, 데이터 가져 오기

이 기사는 BILIBILI의 영상 정보를 크롤링하여 " Hua Nong Brothers " 의 영상 정보를 얻었습니다 . 당신 은 스테이션 UP의 모든 비디오 B 크롤링 세부 사항 을 블로그를 참조 할 수 있습니다 . 동영상의 좋아요 수컬렉션 수를 취하고 선형 회귀 모델을 설정하여 관계를 예측합니다. 동영상 좋아요 (x 축)와 컬렉션 (y 축)의 산점도는 다음과 같습니다.
산포도
데이터 집중도가 낮기 때문에 데이터를 정규화해야합니다.이 기사에서는 최대 값과 최소값을 사용하여 정규화합니다.

셋, 모델 훈련

훈련 후 w = 0.7229486928307687 b = 0.20322045504258518 훈련 된 모델은 다음과 같습니다.
훈련 모델

넷째, 코드

# 线型回归模型预测B站视频点赞量与收藏量的关系(华农兄弟)
import json
import numpy as np
import time
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

class LR(object):
    def __init__(self, max_iterator = 1000, learn_rate = 0.01):
        self.max_iterator = max_iterator
        self.learn_rate = learn_rate
        self.w = np.random.normal(1, 0.1)
        self.b = np.random.normal(1, 0.1)

    def cal_day(self, release_date, now_date):
        # 计算天数
        start_time = time.mktime(time.strptime(release_date.split(' ')[0], '%Y-%m-%d'))
        end_time = time.mktime(time.strptime(now_date.split(' ')[0], '%Y-%m-%d'))
        return int((end_time - start_time)/(24*60*60))


    def load_data(self, url):
        with open(url, 'r', encoding='utf-8') as f:
            data_dect = json.load(f)
        # print(data_dect)
        
        # 视频播放数量以及发布距离现在的天数
        watched_number_list = []
        time_list = []
        dm_number_list = []
        liked_list = []
        collected_list = []
        for sample in data_dect:
            # 去掉坏点
            if sample['watched'] != '':
                watched_number_list.append([float(sample['watched'])]) #观看数量
                liked_list.append([float(sample['liked'])])	#点赞数
                collected_list.append([float(sample['collected'])])	#收藏数
                dm_number_list.append([float(sample['bullet_comments'])])	#弹幕数
                time_list.append([float(self.cal_day(sample['date'], sample['now_date']))]) #视频发布距离现在时间

        return np.array(time_list), np.array(watched_number_list), np.array(liked_list), np.array(collected_list), np.array(dm_number_list)

    def train_set_normalize(self, train_set):
        data_range = np.max(train_set) - np.min(train_set)
        return (train_set - np.min(train_set)) / data_range



    def cal_gradient(self, x, y):
    	# 计算梯度
        # print(x, y)
        dw = np.mean((x * self.w + self.b - y) * x)
        db = np.mean(self.b + x * self.w - y)
        return dw, db
    
    
    def train(self, x, y):
        # 训练模型,使用梯度下降
        train_w = []
        train_b = []
        for i in range(self.max_iterator):
            print(self.w, self.b)
            train_w.append(self.w)
            train_b.append(self.b)
            i += 1
            # 计算梯度值,向着梯度下降的方向
            dw, db = self.cal_gradient(x, y)
            self.w -= self.learn_rate*dw
            self.b -= self.learn_rate*db
        return train_w, train_b

    def predict(self, x):
        # 预测
        return x * self.w + self.b
    
    def myplot(self, x, y, train_w, train_b):
        
        plt.pause(2)
        plt.ion()
        # 动态绘图
        for i in range(0, self.max_iterator, 30):
            
            plt.clf()
            # 原始散点图
            plt.scatter(x, y, marker = 'o',color = 'yellow', s = 40)
            plt.xlabel('liked')
            plt.ylabel('collected')
            plt.plot(x, train_w[i] * x  + train_b[i], c='red')
            plt.title('step: %d learning-rate: %.2f function: y=%.2f * x + %.2f' %(i, self.learn_rate, train_w[i], train_b[i]))
            plt.pause(0.5) 
            
        plt.show()
        plt.ioff()
        plt.pause(200)

        
  


lr = LR()
time_list, watched_number_list, liked_list, collected_list, dm_number_list = lr.load_data(r'2020\Crawl\Bilibili\Item1\data\video_detial.json')
# 需要对数据进行归一化处理

tw, tb = lr.train(lr.train_set_normalize(liked_list), lr.train_set_normalize(collected_list))
lr.myplot(lr.train_set_normalize(liked_list), lr.train_set_normalize(collected_list), tw, tb)

참조

  1. https://www.cnblogs.com/geo-will/p/10468253.html

추천

출처blog.csdn.net/qq_37753409/article/details/109004339