python - Logistic 回归的 Sigmoid 曲线有问题
问题描述
我正在尝试根据其持续时间和持久性,对 2010-2019 年 Spotify 上热门歌曲的流行度使用逻辑回归,其数据是从 .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
解决方案
你的 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 logregs
推荐阅读
- javascript - pdf.js 控制台警告 (L10n)
- c# - 如何将 .NET 框架中的 gRPC 客户端与安全的 .NET Core 服务器连接起来?
- r - 为什么 R 找不到与主包位于同一本地文件夹中的依赖项?
- ios - 从 iOS 中的 C 函数中使用 Swift 入口点生成线程
- java - JFRAME, MouseListener 画一个圆
- python - Lasso 中的均方误差 (MSE) 和 Python 中的岭回归
- javascript - 如何使用 JavaScript 继承父元素的 CSS 属性?
- python - Scipy错误不等式约束不兼容(退出模式4)
- vue.js - Vuex - 在 created() 中调度的操作在重新加载窗口之前不会运行?
- prometheus - Istio - 如何添加自定义的基于标签的指标?