机器学习(学习笔记)

目录

1.KNN算法

2.fhjjhjhj


1.KNN算法

  kNN算法属于监督学习,监督学习所需要做的是在给定一部分带有特征和标签两部分数据的情况下,根据这一部分的特征和数据建立一个模型,之后当我们输入新的特征时,这个模型可以返回这种特征所应该贴上的标签。简而言之就是 物以类聚人以群分。即相似的人和物会相聚在一起。

  kNN算法判定待测数据属于哪个类别的依据就是根据离它最近的k个点的类别。哪个类别多,它就属于哪个类别。

如下图所示,当我们设定K3时,离绿色的待测点最近的3个点的类别分别为蓝色,红色,红色。由于蓝红的比分是1:2,所以绿色的待测点属于红色类。当设定K5时,离绿色的待测点最近的5个点的类别分别为红色、红色、蓝色、蓝色、蓝色。蓝红的比分是3:2,所以绿色的待测点属于蓝色类。

kNN算法的优缺点:
  1. 理解简单,数学知识基本为0

  2. 既能用于分来,又能用于回归;

  3. 支持多分类。

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最近邻算法进行多分类:

输入说明:输入由三行组成,每行由一个数组成,第一行表示要生成的数据组数,第二行表示生成的数据一共有几种类别,第三行为一共浮点数,表示数据的噪音。

输出说明,由一行组成,表示分类器在测试数据上所预测的输出的正确数量。

注意事项:

  1. 生成数据时需要使用make_classification函数,n_samplesn_classesflip_y等参数的值为程序的输入值,n_informative参数值要求为20n_redundant参数要求值为0random_state参数值要求为0,要求其他参数均使用默认参数。
  2. train_test_split函数的random_state参数值要求为0
  3. 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值