机器学习

Arthur Samuel提出的机器学习(Machine learning)的定义为:机器学习是一个学习领域,并在没有明确训练的情况下,教给计算机学习的能力。Tom Mitchell提出的机器学习的定义为:计算机程序从经验E中学习任务T,并用度量P来衡量性能。条件是它由P定义的关于T的性能随着经验E而提高。机器学习主要有两类:监督学习和非监督学习。监督学习(Supervised learning)就是我们教计算机如何做事情,而非监督学习(Unsupervised learning)是我们让计算机自己学习。

监督学习

监督学习是指我们给算法一个数据集,并且给定正确答案,算法的目的就是预测给出更多的正确答案。

  • 回归问题:回归是指我们的目标是预测一个连续的输出值。
    例如:给定一个房屋数据集,即每个房子卖出的实际价格,对想要卖的其它房子给出估价。
  • 分类问题:目的是预测离散的输出值。
    例如:根据乳腺瘤的尺寸预测乳腺癌是恶性的还是良性的。可选取多个特征,也可分为多类(两类及以上)

非监督学习

在非监督学习中没有属性和标签这一概念,只有一个数据集。

  • 聚类算法
    应用:组织大型计算机集群、社交网络分析、客户信息数据集分类、天文数据分析。
    k-means算法
    k-means算法是一种经典聚类算法:基本思想是以空间中K个点为中心,进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
    算法的基本步骤:
    1、从n个数据对象任意选择k个对象作为初始聚类中心;并设定最大迭代次数
    2、计算每个对象与k个中心点的距离,并根据最小距离对相应对象进行划分,即把对象划分到与他们最近的中心所代表的类别中去。
    3、对于每一个中心点,遍历他们所包含的对象,计算这些对象所有维度的和的均值,获得新的中心点
    4、如果聚类中心与上次迭代之前相比,有所改变,或者算法迭代次数小于给定的最大迭代次数,则继续执行第二、三两步,否则,程序结束返回聚类结果
    代码实现如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    import numpy as np
    import matplotlib.pyplot as plt
    #随机生成聚类中心
    def initCenters(dataSet,k):
    numSamples, dim = dataSet.shape #shape函数返回数组维度的元组,numSamples行dim列
    centers = np.zeros((k,dim)) #numpy.zeros函数生成指定维数的全零数组
    for i in range(k):
    index = int(np.random.uniform(0,numSamples)) #random get k centers numpy.random.uniform函数从一个均匀分布[low,high)中随机采样
    centers[i, :] = dataSet[index, :] #生成随机选取的聚类中心
    print(centers)
    return centers
    #计算一个数据点到所有聚类中心的距离
    def Dist2Centers(sample,centers):
    k = centers.shape[0] #shape[0]表示行数
    dis2cents = np.zeros(k) #初始化存放一个点到k个聚类中心的距离的1行k列数组
    for i in range(k):
    dis2cents[i] = np.sqrt(np.sum(np.power(sample - centers[i,:],2))) #距离=sqrt(x^2+y^2)
    return dis2cents
    def kmeans(dataSet,k,iterNum):
    numSamples = dataSet.shape[0]
    iterCount = 0

    #clusterAssignment stores which cluster this sample belongs to,
    clusterAssignment = np.zeros(numSamples)
    clusterchanged = True

    ##step 1 : initialize centers
    centers = initCenters(dataSet, k) #初始化聚类中心
    while clusterchanged and iterCount < iterNum:
    clusterchanged = False
    iterCount = iterCount + 1
    ## for each sample
    for i in range(numSamples):

    dis2cent = Dist2Centers(dataSet[i,:],centers)
    minIndex = np.argmin(dis2cent) #返回数组dis2cent中最小值的索引
    ## step3: update its belonged cluster(更新点的所属集群)
    if clusterAssignment[i] != minIndex:
    clusterChanged = True
    clusterAssignment[i] = minIndex

    #求平均值计算新的聚类中心
    for j in range(k):
    pointsInCluster = dataSet[np.nonzero(clusterAssignment[:] == j)[0]]
    centers[j, :] = np.mean(pointsInCluster, axis = 0) #mean(array, axis = 0)函数表示对各列求平均值
    print ('congratulations, Cluster Achieved!')
    return centers, clusterAssignment
    def showCluster(dataSet, k, centers, clusterAssignment):
    numSamples, dim = dataSet.shape

    mark = ['or', 'ob', 'og', 'om']

    # draw all samples
    for i in range(numSamples):
    markIndex = int(clusterAssignment[i])
    plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])

    mark = ['Dr', 'Db', 'Dg', 'Dm']
    # draw the centroids
    for i in range(k):
    plt.plot(centers[i, 0], centers[i, 1], mark[i], markersize = 10)

    plt.show()
    def main():
    ##step1: load dataSet(加载数据集)
    print ("step 1: loading data...")
    dataSet = []
    dataSetFile = open(r'H:\Python自学编写程序\北理工\testSet.txt')
    for line in dataSetFile:
    lineArr = line.strip().split('\t') #去除两边空格,以制表符分割
    dataSet.append([float(lineArr[0]),float(lineArr[1])]) #每个点的[x,y]坐标以列表的形式存入dataSet

    #step 2: clustering...(集群)
    print ("step 2: clustering...")
    dataSet = np.mat(dataSet) #mat函数可以将目标数据的类型转换为矩阵(matrix)

    k = 4 #聚类个数为4
    centers_result, clusterAssignment_result = kmeans(dataSet, k, 100) #最大迭代次数100

    #step 3: show the result
    print ("step3: showing the result...")
    showCluster(dataSet, k, centers_result, clusterAssignment_result)

    main()