python - 如何创建合适的 sigmoid 曲线?

标签 python logistic-regression sigmoid

我正在尝试根据 Spotify 上 2010-2019 年热门歌曲的持续时间和耐用性(其数据是从 .csv 文件收集)的流行度使用逻辑回归。基本上,由于每首歌的流行度值都是数字,所以我将它们都转换为二进制数“0”到“1”。如果一首热门歌曲的流行度值小于70,我会将其当前值替换为0,如果它的值大于70,则反之。

当前的 sigmoid 曲线现在是“log”,因此它显示一条直线。然而,在这段代码的上下文中,我仍然不确定如何添加正确的 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))/y.size
     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()

我的数据集:

CSV File

My Current Graph

我想要什么:

Shape of sigmoid i want

最佳答案

乍一看,您的 Logistic_Regression 初始化似乎非常错误。

我认为你用 [X, 1] 包装 X,然后尝试学习 W = [权重,偏差],一开始应该是 [1, 0]。

请注意,1 是向量 [1, 1, 1...],长度 = 特征向量长度。

关于python - 如何创建合适的 sigmoid 曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59558523/

相关文章:

python - torch.softmax 和 torch.sigmoid 在二进制情况下不等价

python - 为什么 pytorch 中的正则化和 scratch 代码不匹配,pytorch 中用于正则化的公式是什么?

python - git 和 python : Clone a repository using subprocess module in python

python Pycharm : Out of memory when loading large JSON files

Python 修剪/过滤掉点

apache-spark - 我可以在 pyspark 中提取 Logistic 回归系数的有效值吗

c++ - 用于图像故障检测的逻辑回归

scikit-learn - 管道中 LogisticRegression 的 _coef 值过多

python - 计算 sigmoid 最快的方法是什么?

python - 使用 sigmoid 函数有什么好处?