目录
1.KNN算法
kNN
算法属于监督学习,监督学习所需要做的是在给定一部分带有特征和标签两部分数据的情况下,根据这一部分的特征和数据建立一个模型,之后当我们输入新的特征时,这个模型可以返回这种特征所应该贴上的标签。简而言之就是 物以类聚人以群分。即相似的人和物会相聚在一起。
kNN
算法判定待测数据属于哪个类别的依据就是根据离它最近的k
个点的类别。哪个类别多,它就属于哪个类别。
如下图所示,当我们设定K
为3
时,离绿色的待测点最近的3
个点的类别分别为蓝色,红色,红色。由于蓝红的比分是1:2
,所以绿色的待测点属于红色类。当设定K
为5
时,离绿色的待测点最近的5
个点的类别分别为红色、红色、蓝色、蓝色、蓝色。蓝红的比分是3:2
,所以绿色的待测点属于蓝色类。
kNN
算法的优缺点:
-
理解简单,数学知识基本为
0
; -
既能用于分来,又能用于回归;
-
支持多分类。
kNN
算法可以用于回归,回归的思路是将离待测点最近的k
个点的平均值作为待测点的回归预测结果。
kNN
算法在测试阶段是看离待测点最近的k
个点的类别比分,所以不管训练数据中有多少种类别,都可以通过类别比分来确定待测点类别。
当然kNN
算法的缺点也很明显,就是当训练集数据量比较大时,预测过程的效率很低。这是因为kNN
算法在预测过程中需要计算待测点与训练集中所有点的距离并排序。可想而知,当数据量比较大的时候,效率会奇低。
利用在sklearn对K最近邻算法进行实现:
from sklearn.datasets import make_blobs
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
samples=int(input())#第一行表示要生成的数据组数
random_state=int(input())#第二行表示生成数据时所使用的随机状态
data=make_blobs(n_samples=samples,random_state=random_state)
X, Y=data#训练数据
clf=KNeighborsClassifier() #生成K近邻分类器
clf.fit(X,Y) #训练分类器
x=int(input())#待测点的特征值;
y=int(input())#带测点的特征值;
print(clf.predict([[x,y]])) #进行预测。
make_blobs主要是产生聚类数据集,产生一个数据集和相应的标签。
make_blobs(n_samples = 100, n_features = 2, centers = 3, cluster_std = 1.0, center_box = (-10.0, 10.0), shuffle = True, random_state = None)
n_samples=100,数据样本点个数,默认为100.
n_features=2,是每个样本的特征(或属性)数,也表示数据的维度,默认值是2.
centers = 3 ,表示类别数(标签的种类数),默认值3;
cluster_std = 1.0 ,表示每个类别的方差,例如我们希望生成2类数据,其中一类比另一类具有更大的方差,可以将cluster_std设置为[1.0, 3.0],浮点数或者浮点数序列,默认值1.0;
center_box = (-10.0, 10.0) ,中心确定之后的数据边界,默认值(-10.0, 10.0);
shuffle = True ,将数据进行洗乱,默认值是True;
random_state = None ,官网解释是随机生成器的种子,可以固定生成的数据,给定数之后,每次生成的数据集就是固定的。若不给定值,则由于随机性将导致每次运行程序所获得的的结果可能有所不同。在使用数据生成器练习机器学习算法练习或python练习时建议给定数值。
使用K最近邻算法进行多分类:
输入说明:输入由三行组成,每行由一个数组成,第一行表示要生成的数据组数,第二行表示生成的数据一共有几种类别,第三行为一共浮点数,表示数据的噪音。
输出说明,由一行组成,表示分类器在测试数据上所预测的输出的正确数量。
注意事项:
- 生成数据时需要使用
make_classification
函数,n_samples
,n_classes
和flip_y
等参数的值为程序的输入值,n_informative
参数值要求为20
,n_redundant
参数要求值为0
,random_state
参数值要求为0
,要求其他参数均使用默认参数。 train_test_split
函数的random_state
参数值要求为0
。- K均值分类器也要求均使用默认参数。
# -*- coding: utf-8 -*-
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
samples=int(input())
classNum=int(input())
noise=float(input())
# 请在此添加代码 完成本关任务
#
# ********** Begin *********#
X,Y=make_classification(n_samples=samples, n_informative=20, n_redundant=0, n_classes=classNum,flip_y=noise,random_state=1)
X1,X2,Y1,Y2=train_test_split(X,Y,random_state=1)
clf=KNeighborsClassifier()
clf.fit(X1,Y1)
count=0
for i in range(0,len(Y2)):
if clf.predict(X2)[i]==Y2[i]:
count+=1
print(count)
#
# ********** End **********#
2.梯度下降算法
损失函数为:loss=2∗(θ−3) 最优参数为:3.0
def gradient_descent(initial_theta,eta=0.05,n_iters=1000,epslion=1e-8):
'''
梯度下降
:param initial_theta: 参数初始值,类型为float
:param eta: 学习率,类型为float
:param n_iters: 训练轮数,类型为int
:param epslion: 容忍误差范围,类型为float
:return: 训练后得到的参数
'''
# 请在此添加实现代码 #
#********** Begin *********#
theta=initial_theta
i_iter=0
while i_iter<n_iters:
gradient=2*(theta-3)
last_theta=theta
theta=theta-eta*gradient
if(abs(theta-last_theta)<epslion):
break
i_iter+=1
#********** End **********#
return theta
3.正规矩阵方法
import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
np.random.seed(1)
def lr(x_train, x_test, y_train, y_test):
"""
:param x_train: 训练集
:param x_test: 训练集标签
:param y_train: 测试集
:param y_test: 测试集标签
:return: 预测值与测试集标签的均方误差
"""
# 请根据提示在下面补全代码
# ********** Begin ********* #
# 使用正规方程公式求得theta
theta = np.linalg.inv(x_train.T.dot(x_train)).dot(x_train.T).dot(y_train)
# 使用theta预测结果
predict=x_test.dot(theta)
# 求出预测值与目标值的均方误差
mse=np.mean((predict-y_test)**2)
# ********** End ********* #
return mse
if __name__ == '__main__':
X, Y = make_regression(n_samples=500, n_features=1, n_targets=1, noise=1.5)
x_train, x_test, y_train, y_test = train_test_split(X, Y)
mse = lr(x_train, x_test, y_train, y_test)
print(mse)