Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Logistic回归的Sigmoid曲线有问题_Python_Pandas_Numpy_Sigmoid - Fatal编程技术网

Python Logistic回归的Sigmoid曲线有问题

Python Logistic回归的Sigmoid曲线有问题,python,pandas,numpy,sigmoid,Python,Pandas,Numpy,Sigmoid,我试图使用逻辑回归方法,根据歌曲的持续时间和耐用性,对Spotify 2010-2019年间热门歌曲的流行程度进行分析,这些歌曲的数据是从.csv文件中收集的。基本上,由于每首歌曲的流行度值都是数字,我将它们转换为二进制数字“0”到“1”。如果热门歌曲的流行度值小于70,我会将其当前值替换为0,如果其值大于70,则反之亦然。出于某种原因,由于我的代码的其余部分在创建sigmoid函数方面相当标准,最终结果是一条直线而不是sigmoid曲线 %matplotlib inline import

我试图使用逻辑回归方法,根据歌曲的持续时间和耐用性,对Spotify 2010-2019年间热门歌曲的流行程度进行分析,这些歌曲的数据是从.csv文件中收集的。基本上,由于每首歌曲的流行度值都是数字,我将它们转换为二进制数字“0”到“1”。如果热门歌曲的流行度值小于70,我会将其当前值替换为0,如果其值大于70,则反之亦然。出于某种原因,由于我的代码的其余部分在创建sigmoid函数方面相当标准,最终结果是一条直线而不是sigmoid曲线

 %matplotlib inline
 import numpy as np
 import matplotlib.pyplot as plt 
 import pandas as pd

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

 BPM = df.bpm
 BPM = np.array(BPM)
 Energy = df.nrgy
 Energy = np.array(Energy)
 Dance = df.dnce
 Dance = np.array(Dance)
 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)

 df.loc[df['popu'] <= 70, 'popu'] = 0

 df.loc[df['popu'] > 70, 'popu'] = 1

 def Logistic_Regression(X, y, iterations, alpha):
   ones = np.ones((X.shape[0], ))
   X = np.vstack((ones, X))
   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))
     b = b + alpha * gradient
     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():
   Dur = df.dur
   Dur = np.array(Dur)
   Pop = df.popu

   Pop = [int(i) for i in Pop]; Pop = np.array(Pop)


   plt.figure(figsize=(10,8))
   colormap = np.array(['r', 'b'])
   plt.scatter(Dur, Pop, c = colormap[Pop], alpha = .4)
   b = Logistic_Regression(Dur, Pop, iterations = 8000, alpha = 0.00005)
   print('Done')

   p_hat = sigmoid(np.dot(Dur, b[1]) + b[0])
   idxDur = np.argsort(Dur)
   plt.plot(Dur[idxDur], p_hat[idxDur])
   plt.show()

 LR1()

 df
%matplotlib内联
将numpy作为np导入
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
df=pd.read_csv('top10s[SubtitleTools.com](2.csv'))
BPM=df.BPM
BPM=np.array(BPM)
能量=df.nrgy
能量=np.阵列(能量)
舞蹈
舞蹈=np.数组(舞蹈)
dB=df.dB
dB=np.数组(dB)
Live=df.Live
Live=np.数组(Live)
价=df.val
价=np.数组(价)
Acous=df.Acous
Acous=np.数组(Acous)
语音=df.spch
语音=np.数组(语音)
df.loc[df['popu']70,'popu']=1
def Logistic_回归(X,y,迭代次数,alpha):
1=np.1((X.shape[0],))
X=np.vstack((一个,X))
X=X.T
b=np.零(X.形[1])
对于范围内的i(迭代):
z=np.点(X,b)
p_hat=乙状结肠(z)
梯度=np.dot(X.T,(y-p_hat))
b=b+alpha*梯度
如果(i%1000==0):
打印('LL,i',log_可能性(X,y,b),i)
返回b
def乙状结肠(z):
返回1/(1+np.exp(-z))
def log_可能性(X,y,b):
z=np.点(X,b)
LL=np.sum(y*z-np.log(1+np.exp(z)))
返回LL
def LR1():
Dur=df.Dur
Dur=np.数组(Dur)
Pop=df.popu
Pop=[int(i)表示Pop中的i];Pop=np.数组(Pop)
plt.图(figsize=(10,8))
colormap=np.array(['r','b'])
plt.散射(Dur,Pop,c=colormap[Pop],alpha=0.4)
b=逻辑回归(Dur,Pop,迭代次数=8000,α=0.00005)
打印(‘完成’)
p_hat=sigmoid(np.dot(Dur,b[1])+b[0])
idxDur=np.argsort(Dur)
plt.plot(Dur[idxDur],p_hat[idxDur])
plt.show()
LR1()
df


您的logreg参数显示不正确,因此您的梯度下降有问题

如果我这样做

from sklearn.linear_model import LogisticRegression    
df = pd.DataFrame({'popu':[0,1,0,1,1,0,0,1,0,0],'dur'[217,283,200,295,221,176,206,260,217,213]})
logreg = LogisticRegression()
logreg.fit(Dur.reshape([10,1]),Pop.reshape([10,1]))
print(logreg.coef_)
print(logreg.intercept_)
我得到[0.86473507,-189.79655798]

而你的参数(b)则是[0.012136874150412973-0.2430389407767768]的数据


vs scikit LOGREG的绘图

由于您的乙状结肠显示为~0或~1,因此其参数(np.dot(Dur,b[1])+b[0])必须是较大的正值或负值。也许你错过了一次正常化。