在vmbox里面安装Ubuntu16.04并且配置jdk以及Hadoop配置的教程【附带操作步骤】_张小鱼༒的博客-CSDN博客
目录
系列优秀文章目录
前言
一、机器学习概述
1.1、概述
1.2、理性认识
1.3、机器学习、数据分析、数据挖掘区别与联系
二、一些案例介绍
1.基于一元线性回归公式和向量形式计算线性权重和偏置值
2.梯度下降法的使用
3、批量梯度下降法
4、多项式线性回归
5、使用四种线性回归对波斯顿房价进行分析
总结
本篇主要介绍机器学习的一些算法,例如一元线性回归,岭回归,套索回归,弹性网络回归,逻辑斯蒂回归,knn算法等等
提示:以下是本篇文章正文内容,下面案例可供参考
输入: x ∈ X(属性值)
输出: y ∈ Y(目标值 )
获得一个目标函数(target function):
f : X ∈ Y(理想的公式)
输入数据:D = {(x1,y1),(x2,y2),…,(xn,yn)}(历史信息)
最终具有最优性能的假设公式:
g : X → Y(学习得到的最终公式 )
{(Xn,Yn)} from f → ML → g
目标函数f未知(无法得到)
假设函数g类似函数f,但是可能和函数f不同
机器学习中是无法找到一个完美的函数f
机器学习
从数据中获得一个假设的函数g,使其非常接近目标函数f的效果
概念
拟合:构建的算法符合给定数据的特征
x(i) :表示第i个样本的x向量
xi: x向量的第i维度的值
- 鲁棒性:也就是健壮性、稳健性、强健性,是系统的健壮性;当存在异常数据的时候,算法也会拟合数据过拟合和欠拟合显示
- 过拟合:算法太符合样本数据的特征,对于实际生产中的数据特征无法拟合–模型在这个数据集展示的特别好
- 欠拟合:算法不太符合样本的数据特征–训练集不好(不存在函数或者假设不对)
代码如下(示例):
#定义numpy数组数据,分别基于一元线性回归公式和向量形式计算线性权重和偏置值;
#计算结果与ScikitLearn中提供的线性回归函数计算结果进行比较。
import numpy as np
import matplotlib.pyplot as plt
data = np.array([
[10.95, 11.18], #使用array函数创建二维数组
[12.14, 10.43],
[13.22, 12.36],
[13.87, 14.15],
[15.06, 15.73],
[16.30, 16.40],
[17.01, 18.86],
[17.93, 16.13],
[19.01, 18.21],
[20.01, 18.37],
[21.04, 22.61],
[22.10, 19.83],
[23.17, 22.67],
[24.07, 22.70],
[25.00, 25.16],
[25.95, 25.55],
[27.10, 28.21],
[28.01, 28.12],
[29.06, 28.32],
[30.05, 29.18]
])
x = data[:,0] #第一列数据为自变量x,一维数组
y = data[:,1] #第二列数据为因变量y,一维数组
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.figure()
plt.scatter(x,y,s = 40,c = 'b',marker = 'o',alpha = 0.7)
plt.title('数据分布情况')
plt.show()
#第一种方法:按照一元线性回归公式进行计算
temp1_sum = 0.0
temp2_sum = 0.0
for i in range(0,20):
temp1_sum+=x[i]
temp2_sum+=y[i]
x_avg = temp1_sum/20
y_avg = temp2_sum/20
temp1_sum = 0
temp2_sum = 0
for i in range(0,20):
temp_var = x[i]-x_avg
temp1_sum=+temp_var*(y[i]-y_avg)
temp2_sum=+temp_var**2
w = temp1_sum/temp2_sum
b = y_avg - w*x_avg
print('按照一元线性回归公式进行计算')
print('w = ',w)
print('b = ',b)
#在散点图的基础之上增加线性回归值线
x_lim = np.array([0,32])
y_pred = w * x_lim + b
plt.figure()
plt.scatter(x,y,s = 40,c = 'b',marker = 'o',label = '样本点')
plt.plot(x_lim,y_pred,ls = '--',lw = 2,color = 'r',label = '回归曲线')
plt.title('一元线性回归')
plt.legend()
plt.show()
#第二种方法:按照线性回归的向量形式进行计算
x_append = np.ones((20,2))
for i in range(0,20):
x_append[i,0] = x[i]
temp1 = np.dot(x_append.T,x_append)
temp2 = np.linalg.inv(temp1)
temp3 = np.dot(temp2,x_append.T)
wb = np.dot(temp3,y)
print("使用向量形式计算的结果:",wb)
#第三种方法:采用scikit_learn中提供的标准回归函数进行计算
from sklearn import linear_model
#定义一个线性回归对象
lnr = linear_model.LinearRegression()
#训练模型
lnr.fit(x_append,y)#必须是二维数组
print('机器学习库函数计算结果:w:%s,b:%.6f'%(lnr.coef_,lnr.intercept_))
按照一元线性回归公式进行计算 w = 0.9446170044748614 b = 0.7942590155304146
使用向量形式计算的结果: [ 0.99397832 -0.22023935] 机器学习库函数计算结果:w:[0.99397832 0. ],b:-0.220239
代码如下(示例):
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def costFunc(x):
return 0.25*(x**4) - 2.167*(x**3)+6.25*x*x - 7*x
def gradFunc(x):
return x**3 - 6.5*x**2 + 12.5*x -7
x = np.linspace(0,4.5,91)
#仅学习率的梯度下降法
step = 10
xPoint = np.empty(1,)
yPoint = np.empty(1,)
grad = np.empty(1,)
eta = 0.06
initPoint = 0.1
xPoint[0] = initPoint
yPoint[0] = costFunc(initPoint)
grad[0] = gradFunc(initPoint)
plt.figure(figsize = (4.5,4.5))
plt.plot(x,costFunc(x),'b',label = '代价函数')
for i in range(step):
newPoint = xPoint[i] - eta * grad[i]
xPoint = np.append(xPoint,newPoint)
yPoint = np.append(yPoint,costFunc(newPoint))
grad = np.append(grad,gradFunc(newPoint))
xx = [xPoint[i],newPoint]
yy = [yPoint[i],costFunc(newPoint)]
plt.plot(xx,yy,color = 'r',linewidth = 1,linestyle = '--')
colors = ['green','c','b','k','g','pink','r','0.3','0.2','0.1','0.0']
plt.scatter(xPoint,yPoint,s = 40,color = colors,marker = 'o',label = '学习率$\\eta$={:.2f}'.format(eta))
plt.title("梯度下降法示意图",fontsize = 10)
plt.legend(loc = 'upper center',fontsize = 8)
plt.show()
代码如下:
import numpy as np
import matplotlib.pyplot as plt
import time
start = time.time()
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
x=np.array([[10.0,1.0],[11,1],[12,1],[13,1],[14,1]])
y=np.array([20.0,23,25,27,26])
weight=np.empty((2,),float)
print('*******批量梯度下降法********')
def Loss(real,predict):
return 0.5*np.power(np.dot(real-predict,real-predict),2)
def Cal(x,w):
return np.matmul(x,w)
weight=np.random.random(np.shape(weight))
weight=[1.0,1.0]
loss_arr=np.empty([])
plt.scatter(x[:,0],y,s=20,marker='*')
eta=0.002
STEP=4
for step in range(STEP):
if(step%1==0):
plt.plot([9.5,14.5],[9.5*weight[0]+weight[1],14.5*weight[0]+weight[1]],label='第%d次'%(step))
print('第%d次迭代'%(step+1))
pred=Cal(x,weight)
loss=Loss(y.T,pred)
print('损失函数值为:%2f'%loss)
loss_arr=np.append(loss_arr,loss)
delta_w=eta*np.matmul((pred-y),x)
weight-=delta_w
plt.plot([9.5,14.5],[9.5*weight[0]+weight[1],14.5*weight[0]+weight[1]],label='第%d次'%(STEP))
plt.title('批量梯度下降法线性回归')
plt.legend(loc='upper left')
plt.show()
*******批量梯度下降法******** 第1次迭代 损失函数值为:202248.000000 第2次迭代 损失函数值为:10553.813310 第3次迭代 损失函数值为:682.582831 第4次迭代 损失函数值为:84.893686
代码如下:
#生成符合二次多项式特征的数据,并使用多项式回归进行拟合
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures#导入多项式特征模块
x = np.random.uniform(-3,3,size = 200)
X = x.reshape(-1,1)#转换为二维数据,与PolynomialFeatures匹配
y = 1.3*x**2 + 0.9*x + 4 +np.random.normal(0,0.8,size = 200)#生成y数据
plt.scatter(x,y,label = '含噪声样本')
degree = 2
poly = PolynomialFeatures(degree,include_bias = True)#定义多项式特征对象
#poly.fit(X,y)#计算多项式输出特征
#X2 = poly.transform(X)#转换多项式特征
X2 = poly.fit_transform(X,y)#与上面的一样
lr = LinearRegression()#定义线性回归对象
lr.fit(X2,y)#用转换后的多项式特征数据训练线性模型
y_predict = lr.predict(X2)
print('多项式回归评分结果:',lr.score(X2,y))
plt.plot(np.sort(x),y_predict[np.argsort(x)],'r',label = '多项回归曲线')
plt.title('多项式线性回归(degree = %d)'%degree)
plt.legend()
#np.sort(x)#返回x排序后的结果
#np.argsort(x)#返回x排序后的序号结果
plt.show()
波斯顿房价数据的属性说明:
CRIM--城镇人均犯罪率 ------【城镇人均犯罪率】
ZN - 占地面积超过25,000平方英尺的住宅用地比例。 ------【住宅用地所占比例】
INDUS - 每个城镇非零售业务的比例。 ------【城镇中非商业用地占比例】
CHAS - Charles River虚拟变量(如果是河道,则为1;否则为0 ------【查尔斯河虚拟变量,用于回归分析】
NOX - 一氧化氮浓度(每千万份) ------【环保指标】
RM - 每间住宅的平均房间数 ------【每栋住宅房间数】
AGE - 1940年以前建造的自住单位比例 ------【1940年以前建造的自住单位比例 】
DIS -波士顿的五个就业中心加权距离 ------【与波士顿的五个就业中心加权距离】
RAD - 径向高速公路的可达性指数 ------【距离高速公路的便利指数】
TAX - 每10,000美元的全额物业税率 ------【每一万美元的不动产税率】
PTRATIO - 城镇的学生与教师比例 ------【城镇中教师学生比例】
B - 1000(Bk - 0.63)^ 2其中Bk是城镇黑人的比例 ------【城镇中黑人比例】
LSTAT - 人口状况下降% ------【房东属于低等收入阶层比例】
MEDV - 自有住房的中位数报价, 单位1000美元 ------【自住房屋房价中位数】
代码如下:
#使用四种线性回归对波斯顿房价做出分析
import numpy as np
np.set_printoptions(precision = 2)#设定输出为数组格式
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
import warnings
warnings.filterwarnings('ignore')
from sklearn import datasets
#导入sklearn中的线性模型与模型验证类
from sklearn import linear_model
from sklearn import model_selection
#加载房价数据
boston = datasets.load_boston()
#采用留出法划分数据集:测试集为30%
x_train,x_test,y_train,y_test = model_selection.train_test_split(boston.data,boston.target,test_size = 0.3,random_state =1)
lnr = linear_model.LinearRegression()#定义线性回归对象
rdr = linear_model.Ridge(alpha = 0.5#岭回归对象
lsr = linear_model.Lasso(alpha = 0.5)#定义套索回归对象,tol = le-5,max_iter = 10000
enet = linear_model.ElasticNet(alpha = 1.0,l1_ratio = 0.5)#定义弹性网络回归对象
#使用线性回归模型
lnr.fit(x_train,y_train)
w1 = lnr.coef_
b1 = lnr.intercept_
print("线性回归权重值:",w1)
print("线性回归偏置值:%.2f"%b1)
y_pred1 = lnr.predict(x_test)
var1 = np.mean((y_pred1-y_test)**2)
print("线性回归模型在测试集上的均方误差:%.2f"%(var1))
score1 = lnr.score(x_test,y_test)
print("线性回归模型在测试集上的评价得分:%.2f\n"%(score1))
#使用岭回归模型
rdr.fit(x_train,y_train)
w2 = lnr.coef_
b2 = lnr.intercept_
print("岭回归权重值:",w2)
print("岭回归偏置值:%.2f"%b2)
y_pred2 = rdr.predict(x_test)
var2 = np.mean((y_pred2-y_test)**2)
print("岭回归模型在测试集上的均方误差:%.2f"%(var2))
score2 = rdr.score(x_test,y_test)
print("岭回归模型在测试集上的评价得分:%.2f\n"%(score2))
#使用套索回归模型
lsr.fit(x_train,y_train)
print("套索回归权重值:",lsr.coef_)
print("套索回归偏置值:%.2f"%lsr.intercept_)
print("套索回归迭代步数:",lsr.n_iter_)
print("套索回归模型在测试集上的均方误差:%.2f"%(lsr.score(x_train,y_train)))
print("套索回归模型在测试集上的评价得分:%.2f\n"%(lsr.score(x_test,y_test)))
#使用zip函数分别对以上四个模型进行打包压缩
models = [lnr,rdr,lsr,enet]
names = ["线性回归","岭回归","套索回归","弹性网络"]
for model,name in zip(models,names):
model.fit(x_train,y_train)
print("权值为:{}".format(model.coef_))
print("%s偏置值:%.2f"%(name,model.intercept_))
y_pred = model.predict(x_test)
var = np.mean((y_pred-y_test)**2)
print("%s在测试集上的均方误差:{}"%(name).format(var))
score = model.score(x_test,y_test)
print("%s模型在测试集上的评价得分:%.2f\n"%(name,score))
#测试alpha在不同取值下的回归效果
scores = []
alphas = [0.0001,0.0005,0.001,0.005,0.01,0.05,0.1,0.5,1,5,10,50]
for index,model in enumerate(models):
scores.append([])
for alpha in alphas:
if index>0:
model.alpha = alpha
model.fit(x_train,y_train)
scores[index].append(model.score(x_test,y_test))
#以四种不同的图显示alpha1取值不同的准确率变化曲线
for i,name in enumerate(names):
fig = plt.figure(i+1,figsize = (4,3))
plt.xlim([0,10])
plt.ylim([0.4,0.9])
plt.plot(range(len(alphas)),scores[i],color = 'r',linewidth = 2)
plt.title(name+'alpha取不同值的准确率')
print("%s的准确率最大值:%.2f"%(name,max(scores[i])))
plt.show()
#以子图显示alpha1取值不同的准确率变化曲线
fig = plt.figure(figsize=(10,7))
for i,name in enumerate(names):
plt.subplot(2,2,i+1)
plt.xlim([0,10])
plt.ylim([0.4,0.9])
plt.plot(range(len(alphas)),scores[i])
plt.title(name+'alpha取不同值的准确率')
print("%s的准确率最大值:%.2f"%(name,max(scores[i])))
plt.show()
线性回归权重值: [-9.85e-02 6.08e-02 5.92e-02 2.44e+00 -2.15e+01 2.80e+00 3.57e-03 -1.52e+00 3.08e-01 -1.13e-02 -1.01e+00 6.45e-03 -5.69e-01] 线性回归偏置值:46.40 线性回归模型在测试集上的均方误差:19.83 线性回归模型在测试集上的评价得分:0.78 岭回归权重值: [-9.85e-02 6.08e-02 5.92e-02 2.44e+00 -2.15e+01 2.80e+00 3.57e-03 -1.52e+00 3.08e-01 -1.13e-02 -1.01e+00 6.45e-03 -5.69e-01] 岭回归偏置值:46.40 岭回归模型在测试集上的均方误差:19.43 岭回归模型在测试集上的评价得分:0.79 套索回归权重值: [-0.07 0.06 -0. 0. -0. 1.57 0. -0.9 0.26 -0.01 -0.75 0.01 -0.7 ] 套索回归偏置值:38.77 套索回归迭代步数: 50 套索回归模型在测试集上的均方误差:0.68 套索回归模型在测试集上的评价得分:0.74 权值为:[-9.85e-02 6.08e-02 5.92e-02 2.44e+00 -2.15e+01 2.80e+00 3.57e-03 -1.52e+00 3.08e-01 -1.13e-02 -1.01e+00 6.45e-03 -5.69e-01] 线性回归偏置值:46.40 线性回归在测试集上的均方误差:{} 线性回归模型在测试集上的评价得分:0.78 权值为:[-9.28e-02 6.16e-02 2.83e-02 2.32e+00 -1.48e+01 2.87e+00 -1.97e-03 -1.42e+00 2.92e-01 -1.19e-02 -9.26e-01 6.88e-03 -5.76e-01] 岭回归偏置值:41.48 岭回归在测试集上的均方误差:{} 岭回归模型在测试集上的评价得分:0.79 权值为:[-0.07 0.06 -0. 0. -0. 1.57 0. -0.9 0.26 -0.01 -0.75 0.01 -0.7 ] 套索回归偏置值:38.77 套索回归在测试集上的均方误差:{} 套索回归模型在测试集上的评价得分:0.74 权值为:[-0.07 0.06 -0. 0. -0. 0.61 0.02 -0.69 0.27 -0.01 -0.72 0.01 -0.75] 弹性网络偏置值:43.50 弹性网络在测试集上的均方误差:{} 弹性网络模型在测试集上的评价得分:0.70
线性回归的准确率最大值:0.78
岭回归的准确率最大值:0.79
套索回归的准确率最大值:0.79
弹性网络的准确率最大值:0.79
线性回归的准确率最大值:0.78 岭回归的准确率最大值:0.79 套索回归的准确率最大值:0.79 弹性网络的准确率最大值:0.79
6、迭代算法
代码如下;
import sklearn.datasets as datasets
import numpy as np
from sklearn.linear_model import LogisticRegression as LR, LogisticRegression
class LogisticRegression():
def __init__(self,alpha=0.01,epochs=3):
self.W = None
self.b = None
self.alpha = alpha
self.epochs = epochs
def fit(self,X,y):
self.W = np.random.normal(size=(X.shape[1]))
self.b = 0
for epoch in range(self.epochs):
if epoch%100 == 1:
print("********第%s次迭代********"%epoch)
print("当前权值:",self.W)
print("当前偏置值",self.b)
w_derivate = np.zeros_like(self.W)
b_derivate = 0
for i in range(len(y)):
w_derivate+=(y[i] -1/(1+np.exp(-np.dot(X[i],self.W.T)-self.b)))*X[i]
b_derivate+=(y[i] -1/(1+np.exp(-np.dot(X[i],self.W.T)-self.b)))
self.W = self.W + self.alpha*np.mean(w_derivate,axis=0)
self.b = self.b + self.alpha*np.mean(b_derivate)
return self
def predict(self,X):
p_1 = 1/(1+np.exp(-np.dot(X,self.W)-self.b))
return np.where(p_1>0.5,1,0)
def accuracy(pred, true):
count = 0
for i in range(len(pred)):
if (pred[i] == true[i]):
count += 1
return count / len(pred)
def normalize(x):
return (x - np.min(x)) / (np.max(x) - np.min(x))
digits = datasets.load_breast_cancer()
X = digits.data
y = digits.target
print('数据集规模:', np.shape(X))
X_norm = normalize(X)
X_train = X_norm[:int(len(X_norm) * 0.7)]
X_test = X_norm[int(len(X_norm) * 0.7):]
y_train = y[:int(len(X_norm) * 0.7)]
y_test = y[int(len(X_norm) * 0.7):]
lr_self = LogisticRegression(epochs=500, alpha=0.03)
lr_self.fit(X_train, y_train)
y_pred = lr_self.predict(X_test)
print("自编逻辑斯蒂回归模型准确率:", accuracy(y_pred, y_test))
clf_lr = LR()
clf_lr.fit(X_train, y_train)
y_pred2 = clf_lr.predict(X_test)
print("机器学习库逻辑斯蒂回归模型准确率:", accuracy(y_pred2, y_test))
数据集规模: (569, 30) ********第1次迭代******** 当前权值: [ 1.73956066 -0.01156931 -1.15917199 0.45711651 0.46040207 -0.01313549 1.23924975 0.22666179 1.70779234 -0.49281854 -0.50133985 0.29592582 -0.39109388 -2.17097176 -1.37779733 -0.5740774 0.05305788 -1.97634564 -2.06258227 2.07302302 -0.85252618 -0.77235803 -0.19870169 0.04144355 -0.54630171 -0.37447985 -0.50281008 -1.03194826 -0.43102844 0.42670525] 当前偏置值 0.6656184693726089 ********第101次迭代******** 当前权值: [-1.36236283 -3.1134928 -4.26109548 -2.64480697 -2.64152142 -3.11505898 -1.86267374 -2.87526169 -1.39413115 -3.59474203 -3.60326334 -2.80599767 -3.49301737 -5.27289525 -4.47972081 -3.67600089 -3.0488656 -5.07826912 -5.16450575 -1.02890047 -3.95444967 -3.87428152 -3.30062518 -3.06047994 -3.6482252 -3.47640334 -3.60473357 -4.13387175 -3.53295192 -2.67521824] 当前偏置值 4.2264662880627215 ********第201次迭代******** 当前权值: [-3.64541622 -5.39654619 -6.54414888 -4.92786037 -4.92457482 -5.39811237 -4.14572713 -5.15831509 -3.67718455 -5.87779542 -5.88631674 -5.08905107 -5.77607076 -7.55594865 -6.76277421 -5.95905428 -5.331919 -7.36132252 -7.44755915 -3.31195387 -6.23750307 -6.15733491 -5.58367858 -5.34353333 -5.93127859 -5.75945674 -5.88778696 -6.41692514 -5.81600532 -4.95827163] 当前偏置值 4.450665474290417 ********第301次迭代******** 当前权值: [-5.05721197 -6.80834194 -7.95594463 -6.33965612 -6.33637057 -6.80990812 -5.55752288 -6.57011084 -5.0889803 -7.28959117 -7.29811248 -6.50084682 -7.18786651 -8.96774439 -8.17456996 -7.37085003 -6.74371475 -8.77311827 -8.8593549 -4.72374962 -7.64929882 -7.56913066 -6.99547433 -6.75532908 -7.34307434 -7.17125249 -7.29958271 -7.82872089 -7.22780107 -6.37006738] 当前偏置值 4.041335598886869 ********第401次迭代******** 当前权值: [-5.95660858 -7.70773855 -8.85534123 -7.23905273 -7.23576717 -7.70930473 -6.45691949 -7.46950745 -5.9883769 -8.18898778 -8.19750909 -7.40024343 -8.08726312 -9.867141 -9.07396657 -8.27024664 -7.64311136 -9.67251488 -9.75875151 -5.62314622 -8.54869542 -8.46852727 -7.89487094 -7.65472569 -8.24247095 -8.0706491 -8.19897932 -8.7281175 -8.12719768 -7.26946399] 当前偏置值 3.5836074309001096 自编逻辑斯蒂回归模型准确率: 0.9532163742690059 机器学习库逻辑斯蒂回归模型准确率: 0.935672514619883
以上就是今天要讲的内容,本文仅仅简单介绍了机器学习当中几种基本算法,希望对初学者的你有所帮助。
最后欢迎大家点赞,收藏⭐,转发,
如有问题、建议,请您在评论区留言哦。