机器学习简单介绍

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39232265/article/details/79951795

一、机器学习概念

1、 什么是机器学习

机器学习算法使用计算方法直接从数据中“学习”信息,而不依赖于预定方程模型。当可用于学习的样本数量增加时,这些算法可自适应提高性能。
简单说,机器学习的目的就是让计算机随着经验的积累自动提高性能。

2、应用领域

  1. 计算金融学,用于信用评估和算法交易
  2. 图像处理和计算机视觉,用于人脸识别、运动检测和对象检测
  3. 计算生物学,用于肿瘤检测、药物发现和DNA 顺序分析
  4. 能源生产,用于预测价格和负荷
  5. 汽车、航空航天和制造业,用于预见性维护
  6. 自然语言处理

二、机器学习两大类型

两大类型

1、监督式学习

监督式学习算法接受已知的输入数据集和对数据的已知响应(输出),然后训练模型,让模型能够为新输入数据的响应生成合理的预测。

监督式学习又可分为分类回归两大类:
- 分类技术可预测离散的响应—例如,电子邮件是真正邮件还是垃圾邮件,肿瘤是恶性还是良性的。分类模型可将输入数据划分成不同类别。典型的应用包括医学成像、语音识别和信用评估。
- 回归技术可预测连续的响应—例如,电力需求中温度或波动的变化。典型的应用包括电力系统负荷预测和算法交易。

2、无监督式学习

无监督学习可发现数据中隐藏的模式或内在结构。这种技术可根据包含未标记响应的输入数据的数据集执行推理。

聚类是一种最常用的无监督学习技术。这种技术可通过探索性数据分析发现数据中隐藏的模式或分组。
聚类的应用包括基因序列分析、市场调查和对象识别。

三、监督式学习的几个常用算法详解

1、KNN(K-近邻)

在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

  1. 计算测试数据与各个训练数据之间的距离
  2. 按照距离的递增关系进行排序
  3. 选取距离最小的K个点
  4. 确定前K个点所在类别的出现频率
  5. 返回前K个点中出现频率最高的类别作为测试数据的预测分类

2、逻辑回归

逻辑回归是线性回归演变而来的,逻辑回归模型是一个非线性模型,最擅长处理二分分类的问题。
首先它的核心,就在于sigmoid函数

σ ( Z ) = 1 / 1 + e Z

sigmoid函数特性:
当Z + 时: σ ( Z ) 1
当Z 时: σ ( Z ) 0
这一函数特性使得在实数域的响应0,1化。
更多关于线性回归、逻辑回归、其他大同小异的回归方法,戳这里: https://blog.csdn.net/viewcode/article/details/8794401

3、神经网络

一个逻辑回归运算就可以当作是一个微型的神经神经网络。
在神经网络中,一个逻辑回归运算就可以当作一个神经元,特点是多输入,一个输出,而sigmoid函数所做的运算在神经网络中称为激活函数。而激活函数不知sigmoid一种,还有ReLU,leaky ReLU,tanh等等。
每一个神经元都由两部分组成,一部分是特征权值组合预测函数Z,另一部分是激活函数g(Z)
神经网络

多个神经元的组合,形成神经网络:
这里写图片描述

4、支持向量机(SVM)

如果能上youtube的童鞋戳这里:https://www.youtube.com/watch?v=3liCbRZPrZA
支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

说到SVM的线性可分功能,实际上SVM还和logistic回归有些渊源,但SVM最大目的在于使得法线两边的margin(间隔)最大化。
当面临线性不可分的情况的时候,变成对凸二次规划问题。
详情请戳:https://blog.csdn.net/v_july_v/article/details/7624837

四、无监督式学习的几个常用算法详解

1、K-means(K-均值)

使用误差平方和(Sum of the Squared Error,SSE)作为聚类的目标函数
算法描述:

  1. 从n个数据对象中任取k个为初始聚类中心
  2. 根据每个聚类对象的均值(中心对象)计算每个对象与这些中心对象的距离,并根据最小距离重新划分分类
  3. 重新计算直到每个聚类不在发生变化

2、K-中心点

大体上跟K-means相同,只是这个算法的中心对象就在每个具体的对象上,而K-means的中心对象可以是平面上任意一点。
算法描述:

  1. 首先随机选取一组聚类样本作为中心点集
  2. 每个中心点对应一个簇
  3. 计算各样本点到各个中心点的距离(如欧几里德距离),将样本点放入距离中心点最短的那个簇中
  4. 计算各簇中,距簇内各样本点距离的绝度误差最小的点,作为新的中心点
  5. 如果新的中心点集与原中心点集相同,算法终止;如果新的中心点集与原中心点集不完全相同,返回b)

算法优缺点(相较于K-means):

  1. K-mediods算法具有能够处理大型数据集,结果簇相当紧凑,并且簇与簇之间明显分明的优点,这一点和K-means算法相同。
  2. 该算法也有K-means同样的缺点,如:必须事先确定类簇数和中心点,簇数和中心点的选择对结果影响很大;一般在获得一个局部最优的解后就停止了;对于除数值型以外的数据不适合;只适用于聚类结果为凸形的数据集等。
  3. 与K-means相比,K-mediods算法对于噪声不那么敏感,这样对于离群点就不会造成划分的结果偏差过大,少数数据不会造成重大影响。
  4. K-mediods由于上述原因被认为是对K-means的改进,但由于按照中心点选择的方式进行计算,算法的时间复杂度也比K-means上升了O(n)。

3、层次聚类

层次聚类算法与之前所讲的顺序聚类有很大不同,它不再产生单一聚类,而是产生一个聚类层次。即形成一个层次树:
这里写图片描述

五、如何应用机器学习

何时该使用机器学习:

  1. 手写规则和方程太过复杂——例如人脸识别和语音识别
  2. 任务的规则始终在变化——例如事务处理记录的欺诈检测
  3. 数据本身在不断变化,程序也必须适应这种变化——例如自动交易、能量需求预测和购物趋势预测等。

当选择监督式或无监督式学习时,你需要关注的三个基本问题:

  1. 你要处理的数据的大小和类型
  2. 你要从数据中获得的洞察力
  3. 如何运用这些洞察力

当权衡各种算法利弊时,你需要考虑:

  1. 训练的速度
  2. 内存的使用
  3. 对新数据预测的准确度
  4. 可解释性和透明度

选择顺序如下图:
这里写图片描述

六、最后的KNN算法实现

使用KNN对测试集进行预测细胞是否是癌细胞
数据集来源:
http://archive.ics.uci.edu/ml的Breast Cancer Wisconsin Diagnostic数据集

python代码:

import numpy as np
import pandas as pd

'''
数据预处理
'''
# 将训练数据和测试数据分别存入pandas数据结构
dataframe_train = pd.read_csv('train', 
                              index_col = None, 
                              header = None, 
                              engine = 'python')
dataframe_test = pd.read_csv('test', 
                              index_col = None, 
                              header = None, 
                              engine = 'python')

# 将读入的数据变成numpy形式的数组                              
train_array = np.array(dataframe_train)
test_array = np.array(dataframe_test)

# 将有特征缺省的数据点去除
nan = []
for i in range(len(train_array)):
    if '?' in train_array[i]:
        nan.append(i)
train_array = np.delete(train_array,nan,axis = 0)
nan = []
for i in range(len(test_array)):
    if '?' in test_array[i]:
        nan.append(i)
test_array = np.delete(test_array,nan,axis = 0)                           

# 将数据类型转从字符串变为浮点型
train_array = train_array.astype('float32')
test_array = test_array.astype('float32')
# 将数组的第0列和第10列去除,用于计算欧式距离
train_array2 = np.delete(train_array,[0,10], axis = 1)
test_array2 = np.delete(test_array,[0,10], axis = 1)

'''
预测测试数据的类型,并对预测做出评估
'''
# 计算距离
k = 3
label = []
for sample in test_array2:
    labels = []
    array1 = train_array2 #初始化array1
    array1 = array1 - sample
    labels.append([train_array[index][10] for index in np.argsort(np.sum(array1**2, axis = 1))[0:k]])
    label.append(sorted([(np.sum(labels==i),i) for i in set(np.array(labels).flat)])[-1][1])

# 将预测的类别与测试数据标记的类别做比较,计算出预测正确的样本个数
count = sorted([(np.sum((test_array[:, 10] - np.array(label))==i),i) for i in set(np.array((test_array[:, 10] - np.array(label))).flat)])[-1][0]
per = count/len(test_array) # 正确率
print(per) # 打印结果

七、其他补充

那个超级好玩的可视化算法网址:
https://codepen.io/collection/DPWwaj/#

猜你喜欢

转载自blog.csdn.net/qq_39232265/article/details/79951795