一、线性回归
*一般用于连续值变量的预测-->机器学习里的有监督学习
(其中x0为1,设置截距)
1.损失函数(衡量好不好)
2.找最小化损失函数:
- 梯度下降
假如现在有n个特征/变量
repeat until convergence{
}
其中,学习率\alpha的确定:太小会收敛慢,太大会振荡,可能找不到最合适的学习率
- 回归与欠/过拟合
(1)过拟合:拟合得过好导致失去了一般性,穿过了每一个点但预测效果差
(2)欠拟合:差距太大
(3)正则化(限制波动太大,解决过拟合问题):
增加惩罚因子( 惩罚因子的取值自己取,取多少,哪些特征要惩罚就靠后面的评价指标去判断,到接受范围内就行)
则修改梯度下降过程:
Repeat until convergence{
}
import numpy
#梯度下降求解损失函数最小值
def gradientDesc(x,y,theta=np.zeros((2,1)),alpha=0.01,iterations=
1500):
m=y.aize
J=[]
for n in range(iterations):
a=theta[0][0]-alpha*(1/m)*sum((x.dot(theta).flatten()-y)*x[:,0])
#dot表示矩阵乘法,flatten降维
b=theta[1][0]-alpha*(1/m)*sum((x.dot(theta).flatten()-y)*x[:,1])
theta[0][0],theta[1][0]=a,b
print(theta[0][0])
print(theta[1][0])
J.append(cost(x,y,theta))
print('Cost:'+str(J[-1]))
return theta
#计算损失函数值并返回
def cost(x,y,theta=np.zeros((2,1))):
m=len(x)
J=1/(2*m)*sum((x.dot(theta).flatten()-y)**2)
return J
或者直接利用python已有的库求线性回归模型
import numpy as np
X=data.iloc[:,0].to_numpy().reshape(-1,1)
Y=data.iloc[:,1].to_numpy().reshape(-1,1)
from sklearn.linear_model import LinearRegression
linear_regressor=LinearRegression()
linear_regressor=fit(X,Y)
Y_pred=linear_regressor.predit(X)
import matplotlib.pyplot as plt
plt.scatter(X,Y)
plt.plot(X,Y_pred,color='red')
plt.show()
预测:
linear_regressor.predict(np.array([[40]]))
二、逻辑回归
1.损失函数
2.梯度函数求最小值
3.二分类与多分类
4.关于样本处理
5.关于特征化处理
逻辑回归python代码(文件路径用的相对路径,在c/用户/Emilia里)
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
import csv
import numpy as np
import math
def loadDataset():
data=[]
labels=[]
with open('logic.txt','r') as f:
reader = csv.reader(f,delimiter='\t')#csv文件,以逗号为分隔值,reader是一行一行的
for row in reader:
data.append([1.0, float(row[0]), float(row[1])])
labels.append(int(row[2]))
#print(data)
return data,labels
def plotBestFit(W):
# 把训练集数据用坐标的形式画出来
dataMat,labelMat=loadDataset()
dataArr = np.array(dataMat)
n = np.shape(dataArr)[0]
xcord1 = []
ycord1 = []
xcord2 = []
ycord2 = []
for i in range(n):
if int(labelMat[i])== 1:
xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
else:
xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)#把画布分成1x1的格子,占第1个格子
ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
ax.scatter(xcord2, ycord2, s=30, c='green')
# 把分类边界画出来
x = np.arange(-3.0,3.0,0.1)
y = (-W[0]-W[1]*x)/W[2]
ax.plot(x,y)
plt.show()
def plotloss(loss_list):
x = np.arange(0,30,0.01)
plt.plot(x,np.array(loss_list),label = 'linear')
plt.xlabel('time') # 梯度下降的次数
plt.ylabel('loss') # 损失值
plt.title('loss trend') # 损失值随着W不断更新,不断变化的趋势
plt.legend() # 图形图例
plt.show()
def main():
# 读取训练集(txt文件)中的数据,
data, labels = loadDataset()
# 将数据转换成矩阵的形式,便于后面进行计算
# 构建特征矩阵X
X = np.array(data)
# 构建标签矩阵y
y = np.array(labels).reshape(-1,1)
# 随机生成一个w参数(权重)矩阵 .reshape((-1,1))的作用是,不知道有多少行,只想变成一列
W = 0.001*np.random.randn(3,1).reshape((-1,1))
# m表示一共有多少组训练数据
m = len(X)
# 定义梯度下降的学习率 0.03
learn_rate = 0.03
loss_list = []
# 实现梯度下降算法,不断更新W,获得最优解,使损失函数的损失值最小
for i in range(3000):
# 最重要的就是这里用numpy 矩阵计算,完成假设函数计算,损失函数计算,梯度下降计算
# 计算假设函数 h(w)x
g_x = np.dot(X,W)
h_x = 1/(1+np.exp(-g_x))
# 计算损失函数 Cost Function 的损失值loss
loss = np.log(h_x)*y+(1-y)*np.log(1-h_x)
loss = -np.sum(loss)/m
loss_list.append(loss)
# 梯度下降函数更新W权重
dW = X.T.dot(h_x-y)/m
W += -learn_rate*dW
# 得到更新后的W,可视化
print('W最优解:')
print(W)
print('最终得到的分类边界:')
plotBestFit(W)
print('损失值随着W不断更新,不断变化的趋势:')
plotloss(loss_list)
# 定义一个测试数据,计算他属于那一类别
test_x = np.array([1,-1.395634,4.662541])
test_y = 1/(1+np.exp(-np.dot(test_x,W)))
print(test_y)
# print(data_arr)
if __name__=='__main__':
main()