В настоящее время я работаю над этим набором данных, который относится к лучшим песням хитов на 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)