zoukankan      html  css  js  c++  java
  • 机器学习总结

    # encoding=utf8
    from sklearn.cluster import KMeans
    from sklearn.datasets import load_digits, fetch_20newsgroups, make_blobs
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import classification_report
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.preprocessing import StandardScaler
    import numpy as np
    import pandas as pd
    
    #回归模型,用来预测
    from sklearn.tree import DecisionTreeClassifier
    
    
    def price_predict():
        #http://scikit-learn.org/stable/modules/linear_model.html
        #数据有三个特征:距离地铁距离、附近小学数量、小区绿化率
        # P =  W1 * A + W2*B + W3 *C
        X = np.array([[500.0, 3.0, 0.3], [1000.0, 1.0, 0.6],
                      [750.0, 2.0, 0.3], [600.0, 5.0, 0.2], [1200.0, 1.0, 0.6]])
        #具有三个特征的房屋对应的房价
        Y = np.array([10000., 9000., 8000., 12000., 8500.])
    
        #将数据转化到均值是0,方差是1的标准分布内
        std_x = StandardScaler()
        x_train = std_x.fit_transform(X)
    
        std_y = StandardScaler()
        y_train = std_y.fit_transform(Y.reshape(-1,1))
    
        #构建线性预测模型
        lr = LinearRegression()
        #模型在历史数据上进行训练,Y.reshape(-1,1)将Y变为二维数组,fit函数要求二维数组
        lr.fit(x_train,y_train)
        #使用训练模型预测新房屋[1300,3.0,0.4]的价格
    
        x_predict = std_x.transform(np.array([[1300,3.0,0.4]]))
        print(std_y.inverse_transform(lr.predict(x_predict)))
    
    
    
    #k近邻分类(k表示以最近的几个邻居作为分类的指标)
    #kNN表示了物以类聚人以群居的基本思考方法,最近的k个邻居是什么类别,预测样本就会被化为该类别
    def knn_predict_rev(point):
        #http://scikit-learn.org/stable/modules/neighbors.html
        #数据理解为二维坐标上的6个点
        X = np.array([[1.0, 1.0], [1, 1.5], [0.5, 1.5],[3.0, 3.0], [3.0, 3.5], [2.8, 3.1]])
        #6个点的类别,按顺序和X依次对应,[1.0,1.0]的类别是0,依次类推
        Y = np.array([0,0,0,1,1,1])
    
        #n_neighbors就是kNN中的k
        knn = KNeighborsClassifier(n_neighbors=3)
        knn.fit(X,Y)
        print(knn.predict(np.array([[2.0,3.0]])))
    
    
    def decide_play():
        #ID3
        """
        #http://scikit-learn.org/stable/modules/tree.html
        什么是Gini?
        dtree.csv样例数据:
        Outlook,Temperatur,Humidity,Windy,PlayGolf
        sunny,85,85,FALSE,no
        sunny,80,90,TRUE,no
        overcast,83,86,FALSE,yes
        rainy,70,96,FALSE,yes
        ......
        :return:
        """
        df = pd.read_csv('dtree.csv')
        #将数据转换为字典格式,orient="record"参数指定数据格式为{column:value}的形式
        #第一行数据为{Outlook:'sunny',Temperatur:85,Humidity:85,Windy:False,PlayGolf:no}
        #一个字典对应一行数据
        dict_train  = df.loc[:,['Outlook','Temperatur','Humidity','Windy']].to_dict(orient="record")
        #如果pandas从DataFrame取出一列数据,该数据类型会变为Series
        dict_target = pd.DataFrame(df['PlayGolf'],columns=['PlayGolf']).to_dict(orient="record")
        #训练数据字典向量化
        dv_train = DictVectorizer(sparse=False)
        x_train = dv_train.fit_transform(dict_train)
    
        #目标数据字典向量化
        dv_target = DictVectorizer(sparse=False)
        y_target = dv_target.fit_transform(dict_target)
    
    
        #创建训练模型并训练
        d_tree = DecisionTreeClassifier()
        d_tree.fit(x_train,y_target)
    
        data_predict = {'Humidity': 85,
          'Outlook': 'sunny',
          'Temperatur': 85,
          'Windy': False}
    
        x_data = dv_train.transform(data_predict)
        print dv_target.inverse_transform(d_tree.predict(x_data))
    
    def article_category():
        #http://scikit-learn.org/stable/modules/naive_bayes.html#multinomial-naive-bayes
        """
        使用朴素贝叶斯,根据关键词对文章内容进行分类
        20newsgroups中的数据形式:
        ['文章1','文章2',........,'文章n']
        整体是一个数组,文章n代表一段文字
        :return:
        """
        #加载20newsgroups数据源,里面是主要英文报刊杂志的文章整理
        #categories指明要加载的文章类别,subset指明要加载训练集
        categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
        twenty_train = fetch_20newsgroups(subset='train',categories=categories)
    
        #计算所有文章的TFIDF
        tfidf_transformer = TfidfVectorizer()
        X_train_tfidf = tfidf_transformer.fit_transform(twenty_train.data)
        #构建多项式朴素贝叶斯模型
        clf = MultinomialNB(alpha=1.0).fit(X_train_tfidf, twenty_train.target)
        #需要判断类别的两篇文章
        docs_new = ['Chemical reaction', 'Intel CPU is good']
        #将要判断的文章向量花
        X_new_tfidf = tfidf_transformer.transform(docs_new)
        #进行预测
        predicted = clf.predict(X_new_tfidf)
        #zip 将数组a[1,2,3] b['a','b','c']变为[(1,'a'),(2,'b'),(3,'c')]
        for doc, category in zip(docs_new, predicted):
            print('%r => %s' % (doc, twenty_train.target_names[category]))
    
    
    from sklearn.svm import LinearSVC
    import matplotlib.pyplot as plt
    #支持向量机:找到分类界面,使支持向量间的间隔最大,支持向量到分割界面的距离最小
    #支持向量是通过到分割界面距离最小的点的向量,且两向量间的距离最大
    def hw_recognition():
        #http://scikit-learn.org/stable/modules/svm.html
        digits = load_digits()
        #random_state 设置随机种子
        X_train, X_test, Y_train, Y_test = train_test_split(digits.data, digits.target,
                                                            test_size=0.25, random_state=23)
        ss = StandardScaler()
        #fit是实例方法,必须由实例调用
        X_train = ss.fit_transform(X_train)
        X_test = ss.transform(X_test)
    
        lsvc = LinearSVC()
        lsvc.fit(X_train, Y_train)
    
        #Y_predict = lsvc.predict(np.array([digits.data[220]]))
        #plt.imshow(digits.images[220])
        #print Y_predict
        #plt.show()
        Y_predict = lsvc.predict(X_test)
        #生成评估报告:
        #precision(精确率) = 正正/(正正+反正)
        #recall(召回率,覆盖率)    = 正正/(正正+正反)
        #按照行解释正反: 正正:真正的正例预测为正例,正反:真正的正例预测为反例,反正:真正的反例预测为正例,
        #反反:真正的反例预测为反例
        print classification_report(Y_test, Y_predict, target_names=digits.target_names.astype(str))
    
    
    
    def kmeans_plot():
        """
        #http://scikit-learn.org/stable/modules/clustering.html
        kmeans算法的过程:(假如有两类)
        1.随机选择两个点作为聚类的中心
        2.计算所有点距离两个中心的距离,选择距离较近的点作为类别。(例如:距离蓝点近,类别是蓝色)
        3.计算已经分好类的各组数据的平均值,使用各组数据的平均值中心作为新的中心
        4.以新的中心为依据,跳转到第2步
        5.直到收敛(两次迭代的数值没有明显的变化:新中心点距离上一次计算中心点的距离小于某个阈值,例如:0.03)
    
        """
        plt.figure(figsize=(6, 3))
    
        n_samples = 1500
        random_state = 170
        X, y = make_blobs(n_samples=n_samples, random_state=random_state)
        y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
    
        plt.subplot(121)
        plt.scatter(X[:, 0], X[:, 1], c=y_pred)
    
        plt.subplot(122)
        plt.scatter(X[:, 0], X[:, 1], c=y)
    
    
    hw_recognition()
    
    """
    A,B表明两个工作地点的收益,A一个小时50$,B一个小时100$
    W1,W2是两地工作时间,称为:权重,机器学习中要调整的系数,[W1,W2]构成一个二维搜索空间
    T = W1 * A + W2 * B 是我们的评估函数
    TMax = 650 是期望目标,也是我们的学习目标
    每天工作8小时,每地至少工作一小时,这是学习约束
    
    delta = |T - TMax| 绝对值是我们的评估函数,损失函数(cost,loss)
    delta达到什么结果搜索结束,由算法来设计,例如delta=1 搜索结束(搜索结束也称为函数收敛)
    
    在搜索空间中尝试搜索过程中,对W1、W2改变的幅度称为学习率
    """
  • 相关阅读:
    20155217 实验四 Android程序设计
    20155217 第十二周课堂测试
    20155217 《Java程序设计》第三次实验报告
    20155217 2016-2017-2 《Java程序设计》第10周学习总结
    20155217 实验二 Java面向对象程序设计 实验报告
    20155217 2016-2017-2 《Java程序设计》第9周学习总结
    20155217 2016-2017-2 《Java程序设计》第8周学习总结
    实验一 Java开发环境的熟悉(Linux+Eclipse)
    Spring阶段性学习总结(一)实现一个简单的HellowWorld
    MySql数据库再学习——使用强化版的自定义连接池连接数据库
  • 原文地址:https://www.cnblogs.com/liangliangzz/p/10299518.html
Copyright © 2011-2022 走看看