pip install scikit-learn
Qhttps://blog.csdn.net/qq_39355550/article/details/82792460
0.机器学习与sklearn的知识图谱
1.逻辑回归
(1)最小二乘法
最小二乘法拟合一次函数(身高)为例。
import numpy as np
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
##样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([162,165,159,173,157,175,161,164,172,158]) #身高数据
Yi=np.array([48,64,53,66,52,68,50,52,64,49])#体重数据
##需要拟合的函数func
def func(p,x):
k,b=p
return k*x+b
##偏差函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
def error(p,x,y):
return func(p,x)-y
#k,b的初始值,可以任意设定,经过几次试验,发现p0的值会影响cost的值:Para[1]
p0=[1,20]
#把error函数中除了p0以外的参数打包到args中
Para=leastsq(error,p0,args=(Xi,Yi))
#读取结果
k,b=Para[0]
print("k=",k,"b=",b)
#画样本点
plt.figure(figsize=(8,6)) ##指定图像比例: 8:6
plt.scatter(Xi,Yi,color="red",label="Sample data",linewidth=2)
#画拟合直线
x=np.linspace(150,180,80) #在150-180直接画80个连续点
y=k*x+b ##函数式
plt.plot(x,y,color="blue",label="Fitting Curve",linewidth=2)
plt.legend() #绘制图例
plt.xlabel('横轴:身高(厘米)', fontproperties = 'simHei', fontsize = 12)
plt.ylabel('纵轴:体重(公斤)', fontproperties = 'simHei', fontsize = 12)
plt.show()
from scipy.optimize import leastsq
然后定义两个Python函数,分别是函数和偏差值,主要是这个error。用leastsq进行最小二乘法拟合。
如果需要画多张图像(窗口),plt.figure(1),plt.figure(2),......
如果需要画多子图,plt.subplot(221)这样
https://www.cnblogs.com/wuwen19940508/p/8638266.html
matplotlib三维画图
fig = plt.figure() ax = fig.gca(projection='3d') ax.plot(x, y, z, label='这里写图例')
使用Q-Q图检验拟合的准确性。
https://blog.csdn.net/u013946794/article/details/49639485
数据中一串数目的每个点都是该数据的某分位点,把这些点的(称为样本分位数点)和
相应的理论上的分位数配对做出散点图,如果该数据服从正态分布,那么该图看上去应该像一条直线,否则就不服从正态分布。
from statsmodels.graphics.api import qqplot
算出xy_res(每一点的残差loss作为一个list)
fig=qqplot(np.array(xy_res),line='q',ax=ax)
(2)逻辑回归
用于解决二分类问题。分为四步
https://blog.csdn.net/weixin_39445556/article/details/83930186
https://blog.csdn.net/weixin_39445556/article/details/84502260
可以用Python Numpy实现:
class logistic(object):
def __init__(self):
self.W = None
def train(self,X,y,learn_rate = 0.01,num_iters = 5000):
num_train,num_feature = X.shape
#init the weight
self.W = 0.001*np.random.randn(num_feature,1).reshape((-1,1))
loss = []
for i in range(num_iters):
error,dW = self.compute_loss(X,y)
self.W += -learn_rate*dW
loss.append(error)
if i%200==0:
print ('i=%d,error=%f' %(i,error))
return loss
def compute_loss(self,X,y):
num_train = X.shape[0]
h = self.output(X)
loss = -np.sum((y*np.log(h) + (1-y)*np.log((1-h))))
loss = loss / num_train
dW = X.T.dot((h-y)) / num_train
return loss,dW
def output(self,X):
g = np.dot(X,self.W)
return self.sigmod(g)
def sigmod(self,X):
return 1/(1+np.exp(-X))
def predict(self,X_test):
h = self.output(X_test)
y_pred = np.where(h>=0.5,1,0)
return y_pred
也可以用:
sklearn.linear_model.LogisticRegression