Как уменьшить график и преобразовать числовые значения в двоичные значения, используя python? - PullRequest
0 голосов
/ 08 января 2020

В настоящее время я работаю над этим набором данных, который относится к лучшим песням хитов на Spotify с 2010 по 2019 год, и я использую Logisti c Регрессия для работы над отношениями между речевостью песен (зависимой) и длительность и валентность соответственно (независимые).

У меня есть две вещи, которые мне нужно выполнить sh для моего графика. Во-первых, как я могу преобразовать речевые значения из числовых в двоичные значения для классификации сигмовидной кривой? Во-вторых, как мне уменьшить масштаб графика, чтобы показать весь график, так как текущий график масштабируется на нескольких последних значениях набора данных?

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt 
import pandas as pd
from sklearn.linear_model import LogisticRegression 

df = pd.read_csv('top10s [SubtitleTools.com] (2).csv')

def Logistic_Regression(X, y, iterations, alpha):
  ones = np.ones((X.shape[0], ))
  X = np.vstack((ones, X)) #add in one more col of 1's to the left
  X = X.T
  b = np.zeros(X.shape[1])

  for i in range(iterations):
      z = np.dot(X, b)
      p_hat = sigmoid(z)
      gradient = np.dot(X.T, (y - p_hat))/y.size
      b = b + alpha * gradient #establishing the gradient ASCENT
      #print log-likelihood at intervals
      if (i % 1000 == 0):
        print('LL,i ', log_likelihood(X, y, b), i)
  return b

def sigmoid(z):
  return 1 / (1 + np.exp(-z))

def log_likelihood(X, y, b):
  z = np.dot(X, b)
  LL = np.sum(y*z - np.log(1 + np.exp(z)))
  return LL

def LR1():
  #taking data from .csv file
  Dur = df.dur
  Dur = np.array(Dur)
  Dance = df.dnce
  Dance = np.array(Dance)
  BPM = df.bpm
  BPM = np.array(BPM)
  Energy = df.nrgy
  Energy = np.array(Energy)
  dB = df.dB
  dB = np.array(dB)
  Live = df.live
  Live = np.array(Live)
  Valence = df.val
  Valence = np.array(Valence)
  Acous = df.acous
  Acous = np.array(Acous)
  Speech = df.spch
  Speech = np.array(Speech)
  Pop = df.popu
  Pop = np.array(Pop)


  plt.figure(figsize=(20,8))
  colormap = np.array(['r', 'b'])
  plt.scatter(Valence, Speech, c = colormap[Speech], alpha = .4)

  b = Logistic_Regression(Valence, Speech, iterations = 8000, alpha = 0.00005)
  print('Done')

  p_hat = sigmoid(np.dot(Valence, b[1]) + b[0]) #predicted probability
  idxDur = np.argsort(Valence) #sort by duration and get index
  plt.plot(Valence[idxDur], p_hat[idxDur]) #plot using sorted index
  plt.title('Valence against Speechiness')
  plt.xlabel('Valence')
  plt.ylabel('Probability of speechiness')
  plt.show()

LR1()

Мой текущий график

Мой набор данных

Есть решение, которое кто-то предлагает мне, но я делаю не знаю где его применять:

Speech = (Speech < 8).astype(int)
...