國家環境教育獎出爐 中市獲獎數全國第一

摘錄自2020年9月21日風傳媒報導

政院環境保護署21日公布第7屆國家環境教育獎得獎名單並公開頒獎,包括財團法人朝陽科技大學獲學校組特優獎、農業委員會林務局東勢林區管理處(八仙山自然教育中心)、台灣電力股份有限公司大甲溪發電廠獲機關(構)組優等獎,及台灣紫斑蝶生態保育協會副理事長陳瑞祥獲個人組優等獎,共獲1項特優、3項優等,得獎成績歷年最佳,得獎數更是全國第一。

環保局副局長陳政良出席表示,台中推動環境教育不遺餘力,除辦理環境教育相關宣導活動,提升市民環境素養,也輔導中市個人、學校、機關及團體參與認證及競賽。這次學校組特優獎得主朝陽科技大學,以建構永續發展為核心價值,持續推展環境教育,包括設置省水省能源裝置、開設環境議題通識課程、鼓勵師生騎電動車及搭乘大眾運輸等友善環境行動。

個人組優等獎得主台灣紫斑蝶生態保育協會副理事長陳瑞祥,投入紫斑蝶保育教育超過15年,發現紫斑蝶季節遷移蝶道,更積極推動國道讓蝶道、標放棲地管理輔導、農藥除草劑減用、文化保存、社區參與等工作,國家地理頻道更製作「蝴蝶密碼(The Butterfly Code)」,吸引更多人投入生態保育工作。

【其他文章推薦】

※客製專屬滑鼠墊、可愛造型L夾、L型資料夾、透明證件套、手提袋,專業印刷設計廠商!  

※示波器鮮為人知的使用技巧?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※買不起高檔茶葉,精緻包裝茶葉罐,也能撐場面!

※貨梯使用安全與保養

※高效率洗滌塔活性碳設備有哪些?

※專業模具開發-五金製品代工製作廠

中國最大八角市場爆「硫磺果」 二氧化硫超標16倍

摘錄自2020年9月23日中央社報導

廣西南寧的八角產量占中國市場的9成,不過,據報,當地批發市場被查出違法使用硫磺燻製的「硫磺八角」,經檢測二氧化硫殘留量超標16倍多。

據新京報報導,南寧高峰天然香料物流中心(高峰市場),是廣西最大的香料物流中心,八角一天出貨量高達300噸,當地大部分業者為了縮短工時、降低成本,都使用硫磺燻製八角。當地業者坦言,高峰市場90%的八角都是「硫磺果」,因二氧化硫超標,這些八角只能透過批發賣給各地商戶。

根據中國《食品安全國家標準食品添加劑使用標準》,硫磺可以作為食品添加劑,但八角並不在適用範圍之列。攝入過量二氧化硫會破壞消化道和呼吸道,產生噁心、嘔吐等胃腸道症狀,長期過量攝入則會引發慢性中毒。

廣西市場監管局目前已查封141噸八角送檢。

【其他文章推薦】

※哪裡買的到省力省空間,方便攜帶的購物推車?

※廢氣洗滌塔,叫得動, 找得到的專業廠商‎

※市面十大品牌封口機!該如何選購?

※塑膠射出成型加工商品有哪些?

※貨梯使用安全與保養

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

Spring系列.AOP原理簡析

Spring AOP使用簡介

Spring的兩大核心功能是IOC和AOP。當我們使用Spring的AOP功能時是很方便的。只需要進行下面的配置即可。

@Component
@Aspect
public class MyAspect {

//PointCut匹配的方法必須是Spring中bean的方法
//Pointcut可以有下列方式來定義或者通過&& || 和!的方式進行組合.
//下面定義的這些切入點就可以通過&& ||組合

private static Logger logger = LoggerFactory.getLogger(MyAspect.class);

//*:代表方法的返回值可以是任何類型
//整個表達式匹配controller包下面任何的的echo方法,方法入參樂意是任意
@Pointcut("execution(* com.csx.demo.spring.boot.controller.*.echo(..))")
public void pointCut1(){}

@Before("pointCut1()")
public void befor(){
    logger.info("前置通知vvvv...");
    logger.info("我要做些事情...");
}
}

然後再開啟註解

//自動選擇合適的AOP代理
//傳統xml這樣配置:<aop:aspectj-autoproxy/>

//exposeProxy = true屬性設置成true,意思是將動態生成的代理類expose到AopContext的ThreadLocal線程
//可以通過AopContext.currentProxy();獲取到生成的動態代理類。

//proxyTargetClass屬性設置動態代理使用JDK動態代理還是使用CGlib代理,設置成true是使用CGlib代理,false的話是使用JDK動態代理

//注意:如果使用Spring Boot的話,下面的配置可以不需要。AopAutoConfiguration這個自動配置類中已經自動開啟了AOP
//默認使用CGLIB動態代理,Spring Boot配置的優先級高於下面的配置

@Configuration
@EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = false)
public class AopConfig {

}

通上面的配置,當我們調用controller包下面的任何類的echo方法時就會觸發前置通知。其實這個說法不是很準確。因為我們調用的類已經不是我們自己寫的類了。而是Spring框架通過動態代理生成的類。

稍微了解一點Spring AOP的同學都會知道Spring的AOP是通過動態代理實現的。那Spring是怎麼生成動態代理類,並將Advice織入代理類的呢?整個流程是怎樣的呢?下面就分析下Spring生成動態代理類的過程。

需要說明下的是,本博客旨在梳理整個AOP動態代理的過程,細節方面需要大家自己去看。

@EnableAspectJAutoProxy幹了些啥

如果讓你從頭開始研究下AOP的原理,你是不是一頭霧水,根本不知道從何入手。但其實看Spring的代碼有個小技巧:如果你要研究一個功能,可以從開啟這個功能的Enable註解開始看。Spring的很多功能都是通過Enable註解開啟的,所以這些註解肯定和這些功能相關。

那麼這邊我們可以從@EnableAspectJAutoProxy這個註解開始着手,看下這個註解做了些什麼操作。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
    //設置為true的話就一直使用cglib動態代理
    //設置為false的話,對於接口使用jdk動態代理,對於類使用cglib代理
	boolean proxyTargetClass() default false;
	boolean exposeProxy() default false;
}

看到上面的@Impoer註解,我們很自然就會想到去看AspectJAutoProxyRegistrar這個類。

//AspectJAutoProxyRegistrar源代碼
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {

    /**
     * 主要作用也就是註冊AnnotationAwareAspectJAutoProxyCreator
     */
    @Override
    public void registerBeanDefinitions(
            AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        //註冊AnnotationAwareAspectJAutoProxyCreator的BeanDefinition
        AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

        AnnotationAttributes enableAspectJAutoProxy =
                AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);
        if (enableAspectJAutoProxy != null) {
            //給上面註冊的BeanDefinition中添加兩個屬相proxyTargetClass和exposeProxy
            if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
                AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
            }
            if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
                AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
            }
        }
    }

}

我們可以看到上面的類中也沒幹什麼特別的事情,就註冊了一個BeanDefinition。如果我們點進去看下AnnotationAwareAspectJAutoProxyCreator這個類的源代碼會發現這個類竟然實現了InstantiationAwareBeanPostProcessor這個接口。熟悉Spring尿性的朋友會敏銳的感覺到Spring可能是在postProcessBeforeInstantiation或者postProcessAfterInstantiation這些方法中對Bean進行動態代理的。

“大膽假設,小心求證”,讓我們帶着這個猜想去看看AnnotationAwareAspectJAutoProxyCreator到底幹了些什麼?

AnnotationAwareAspectJAutoProxyCreator生成動態代理類

@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
    Object cacheKey = getCacheKey(beanClass, beanName);

    if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
        if (this.advisedBeans.containsKey(cacheKey)) {
            return null;
        }
        if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {
            this.advisedBeans.put(cacheKey, Boolean.FALSE);
            return null;
        }
    }
    // 一般不指定CustomTargetSource,所以不會進入這段代碼,所以關鍵代碼在
    // postProcessAfterInitialization中
    // Create proxy here if we have a custom TargetSource.
    // Suppresses unnecessary default instantiation of the target bean:
    // The TargetSource will handle target instances in a custom fashion.
    TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
    if (targetSource != null) {
        if (StringUtils.hasLength(beanName)) {
            this.targetSourcedBeans.add(beanName);
        }
        Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
        Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);
        this.proxyTypes.put(cacheKey, proxy.getClass());
        return proxy;
    }
    return null;
}

下面是創建動態代理類的關鍵代碼。

@Override
    public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
        if (bean != null) {
            Object cacheKey = getCacheKey(bean.getClass(), beanName);
            if (this.earlyProxyReferences.remove(cacheKey) != bean) {
                //這邊是創建代碼類的關鍵代碼
                return wrapIfNecessary(bean, beanName, cacheKey);
            }
        }
        return bean;
    }
protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
        if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
            return bean;
        }
        if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
            return bean;
        }
        if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
            this.advisedBeans.put(cacheKey, Boolean.FALSE);
            return bean;
        }

        // Create proxy if we have advice.
        //獲取當前Bean配置的advice,這步是關鍵
        Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
        if (specificInterceptors != DO_NOT_PROXY) {
            this.advisedBeans.put(cacheKey, Boolean.TRUE);
            //創建代理
            Object proxy = createProxy(
                    bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
            this.proxyTypes.put(cacheKey, proxy.getClass());
            return proxy;
        }

        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }

層層dedug進去我們能看到下面這段代碼,我們口中常說的JDK動態代理和Cglib動態代理就是在這邊生成的。

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {

    @Override
    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: " +
                        "Either an interface or a target is required for proxy creation.");
            }
            if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                //生成JDK動態代理
                return new JdkDynamicAopProxy(config);
            }
            //生成Cglib動態代理
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }
    /**
     * Determine whether the supplied {@link AdvisedSupport} has only the
     * {@link org.springframework.aop.SpringProxy} interface specified
     * (or no proxy interfaces specified at all).
     */
    private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
        Class<?>[] ifcs = config.getProxiedInterfaces();
        return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));
    }

到此,我們已經簡單分析了Spring動態代理類的生成流程。

PS:關於InstantiationAwareBeanPostProcessor接口和BeanPostProcessor接口大家可以自行了解下,這兩個接口是Spring中非常重要的接口。看懂了這兩個接口,Spring很多“神秘”的功能你就能理解了。

簡單總結

通過上面分析,其實我們發現如果不去看AOP動態代理類生成的細節的話,整個Spring AOP的流程還是挺簡單的:

  • @EnableAspectJAutoProxy註解通過AopConfigUtils這個工具類註冊AnnotationAwareAspectJAutoProxyCreator這個類,這個類實現了InstantiationAwareBeanPostProcessor接口,所以會在Bean實例化前後對Bean做一系列額外的操作;
  • AnnotationAwareAspectJAutoProxyCreator的postProcessAfterInitialization中會找出所有和當前Bean相關的Advice,如果找到就創建相應的動態代理類,如果找不到就不生成,返回原始類。

所以整個大流程就這麼簡單。

一些重要類:

  • @EnableAspectJAutoProxy;
  • AspectJAutoProxyRegistrar:註冊AnnotationAwareAspectJAutoProxyCreator
  • AnnotationAwareAspectJAutoProxyCreator:AOP動態代理自動生成的處理類,其他類似的類有AspectJAwareAdvisorAutoProxyCreator和InfrastructureAdvisorAutoProxyCreator等;
  • AopConfigUtils:AOP配置工具類
  • ProxyFactory:代理工廠
  • AopProxy接口:常見實現類ObjenesisCglibAopProxy、JdkDynamicAopProxy

參考

  • https://blog.csdn.net/zhoushimiao1990/article/details/89853368

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

Dotnet core基於ML.net的銷售數據預測實踐

ML.net已經進到了1.5版本。作為Microsoft官方的機器學習模型,你不打算用用?

 

一、前言

ML.net可以讓我們很容易地在各種應用場景中將機器學習加入到應用程序中。這是這個框架很重要的一點。

通過ML.net,我們可以使用手中的可用數據,進行預測、分析、檢測,而不需要進行過於複雜的編程。

ML.net的核心,同樣是機器學習模型。它採用同樣的步驟,通過指定算法來訓練模型,將輸入數據轉換為所需的預測數據。

更重要的是,ML.net基於.NET Core,這讓它可以非常簡單地跨平台,在Windows、Linux、MacOS上運行,並成為我們服務端的一部分內容。

 

回到今天的主題。

我們用實際的例子,完成一個通過歷史銷售數據進行單變量時序分析(單譜分析),以預測未來銷量的需求。

    為了防止不提供原網址的轉載,特在這裏加上原文鏈接:https://www.cnblogs.com/tiger-wang/p/13150021.html

二、開發環境&基礎工程

這個Demo的開發環境是:Mac + VS Code + Dotnet Core 3.1.2。

$ dotnet --info
.NET Core SDK (reflecting any global.json):
 Version:   3.1.201
 Commit:    b1768b4ae7

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.15
 OS Platform: Darwin
 RID:         osx.10.15-x64
 Base Path:   /usr/local/share/dotnet/sdk/3.1.201/

Host (useful for support):
  Version: 3.1.3
  Commit:  4a9f85e9f8

.NET Core SDKs installed:
  3.1.201 [/usr/local/share/dotnet/sdk]

.NET Core runtimes installed:
  Microsoft.AspNetCore.App 3.1.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 3.1.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]

 

首先,在這個環境下建立工程:

  1. 創建Solution
% dotnet new sln -o demo
The template "Solution File" was created successfully.
  1. 這次,我們用Console創建工程
% cd demo
% dotnet new console -o demo
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on demo/demo.csproj...
  Determining projects to restore...
  Restored demo/demo.csproj (in 143 ms).

Restore succeeded.
  1. 把工程加到Solution中
% dotnet sln add demo/demo.csproj

基礎工程搭建完成。

三、引入ML.net庫

為了使用ML.net,我們需要引入Microsoft.ML庫:

% cd demo
% dotnet add package Microsoft.ML

除此之外,本文是基於時序的預測,還需要引入時序庫Microsoft.ML.TimeSeries:

% dotnet add package Microsoft.ML.TimeSeries

 

我們今天用到的算法是單譜分析(SSA)。SSA會將時序分解為一組主要成分, 並將這些成分解釋為信號,對應於趨勢、噪音、季節性及許多其他的因素,然後重新構建這些成分,用來預測未來某個時間的值。

四、準備數據

為了這個DEMO,我準備了一個包含全年365天實際銷售金額的數據。

其中這個數據又分為了兩部分,第一部分是前11個月的數據,用來做訓練,第二部分是12月一個月的數據,用來評估模型。

兩部分數據的鏈接如下:訓練數據,評估數據

兩個數據文件均為CSV文件,數據結構完全相同,下面是一段內容範例:

2018-12-21,17959.0
2018-12-22,19537.03
2018-12-23,20068.0
2018-12-24,20013.0
2018-12-25,21005.0
2018-12-26,16876.0
2018-12-27,15150.0
2018-12-28,15669.0
2018-12-29,25048.0
2018-12-30,25236.0

五、代碼開發

  1. 準備一個輸入模型ModelInput
public class ModelInput
{

    [LoadColumn(0)]
    public DateTime action_time { get; set; }
    [LoadColumn(1)]
    public float count { get; set; }
}

這個模型對應數據文件的結構,分兩個字段,第一個是日期,第二個是對應的銷售金額。

  1. 準備另一個輸出模型ModelOutput
public class ModelOutput
{

    public float[] forecasted_count { get; set; }
    public float[] lower_count { get; set; }
    public float[] upper_count { get; set; }
}

這個模型跟隨預測結果的輸出,其中:

  • forecasted_count – 預測時間段內的預測值
  • lower_count – 預測時間段內預測值的下限
  • upper_count – 預測時間段內預測值的上限

 

  1. 初始化機器學習的實例
MLContext mlContext = new MLContext();

執行所有 ML.NET 操作都是從MLContext類開始,初始化 MLContext將創建一個新的 ML.net 環境,並在模型創建工作流對象之間共享該環境。

  1. 加載數據

ML.net有多種數據的加載方式,可以通過文件、數據庫、JSON/XML、內存中加載數據,甚至可以用自定義的數據庫連接加載數據。

本文的DEMO中,數據在CSV文件中,所以,我們採用下面的方式加載:

static readonly string _data1Path = Path.Combine(Environment.CurrentDirectory, "data1.csv");
static readonly string _data2Path = Path.Combine(Environment.CurrentDirectory, "data2.csv");

static void Main(string[] args)
{
    MLContext mlContext = new MLContext();

    IDataView data1View = mlContext.Data.LoadFromTextFile<ModelInput>(_data1Path, separatorChar: ',', hasHeader: false);
    IDataView data2View = mlContext.Data.LoadFromTextFile<ModelInput>(_data2Path, separatorChar: ',', hasHeader: false);
}

IDataView是數據的承載空間。

  1. 定義時序分析管道
var forecastingPipeline = mlContext.Forecasting.ForecastBySsa(
    outputColumnName: "forecasted_count",
    inputColumnName: "count",
    windowSize: 7,
    seriesLength: 30,
    trainSize: 334,
    horizon: 7,
    confidenceLevel: 0.95f,
    confidenceLowerBoundColumn: "lower_count",
    confidenceUpperBoundColumn: "upper_count");

前面有說過,我們採用單譜分析,所以代碼中我們選擇了mlContext.Forecasting.ForecastBySsa。

解釋一下這裏面的幾個參數:

  • trainSize – 數據樣本的數量,也就是訓練數據的行數(在這個文件中,一行是一個數據樣本,共334行)
  • seriesLength – 從數據樣本按時序採樣時的間隔,這裡是30天
  • windowSize – 樣本周期的天數,這裡是7天
  • horizon – 預測結果的天數
  • confidenceLevel – 上下限的可信度。預測屬於合理猜測,不總是完全準確。
  • 其它幾個參數,對應輸入輸出模型的字段名

 

  1. 訓練模型

管道定義完成,數據加載完成,下面要進行數據訓練。

SsaForecastingTransformer forecaster = forecastingPipeline.Fit(data1View);

跟隨上一節,管道是單譜管道,所以訓練也是單譜訓練SsaForecastingTransformer。

 

程序執行到這裏,數據訓練完成。

  1. 模型評估

模型評估不是必須環節。

模型評估的意義在於:通過評估模型的性能,來調整管道的參數,以達到最佳的預測效果。

模型評估也有多種方式。在這裏,我們採用平均絕對誤差和均方根誤差來做評估依據。

static void Evaluate(IDataView testData, ITransformer model, MLContext mlContext)
{
    IDataView predictions = model.Transform(testData);

    IEnumerable<float> actual =
        mlContext.Data.CreateEnumerable<ModelInput>(testData, true)
            .Select(p => p.count);

    IEnumerable<float> forecast =
        mlContext.Data.CreateEnumerable<ModelOutput>(predictions, true)
            .Select(p => p.forecasted_count[0]);

    var metrics = actual.Zip(forecast, (actualValue, forecastValue) => actualValue - forecastValue);

    var MAE = metrics.Average(error => Math.Abs(error));
    var RMSE = Math.Sqrt(metrics.Average(error => Math.Pow(error, 2)));

    Console.WriteLine("評估結果");
    Console.WriteLine("---------------------");
    Console.WriteLine($"平均絕對誤差: {MAE:F3}");
    Console.WriteLine($"均方根誤差: {RMSE:F3}\n");
}

在這個方法中,我們取評估數據的實際值actual和通過訓練數據生成的預測值forecast,計算兩個誤差並輸出。

在Main中調用此方法:

static void Main(string[] args)
{
        /* 這兒是前邊訓練的代碼,略過 */

        Evaluate(data2View, forecaster, mlContext);
}
static void Evaluate(IDataView testData, ITransformer model, MLContext mlContext)
{
      /* 這兒是評估模型的方法,上面有,略過 */
}

輸出結果類似於以下內容:

評估結果
---------------------
平均絕對誤差: 23.442
均方根誤差: 174.236

兩個指標:

  • 平均絕對誤差 – 度量預測與實際值之間的接近程度。 此值介於 0 到無限大之間。 越接近 0,模型的質量越好。
  • 均方根誤差 – 匯總模型中的錯誤。 此值介於 0 到無限大之間。 越接近 0,模型的質量越好。

 

  1. 預測

訓練模型調整到滿意后,即可開始預測的工作:

var forecastEngine = forecaster.CreateTimeSeriesEngine<ModelInput, ModelOutput>(mlContext);
ModelOutput forecast = forecastEngine.Predict();

這兩行代碼,在內存中加載前邊訓練好的模型,並進行預測操作。預測數據的結果放在forecast中。

對應於分析管道定義中的horizon,預測數據包含7天的預測結果。

  1. 預測結果輸出

放在forecast中的數據,對應模型ModelOutput,可以用在任何地方。

在本文中,我們直接显示到Console:

IEnumerable<string> forecastOutput =
    mlContext.Data.CreateEnumerable<ModelInput>(data2View, reuseRowObject: false)
        .Take(7)
        .Select((ModelInput data, int index) =>
        {
            string action_date = data.action_time.ToString("yyyy-MM-dd");
            float actual_count = data.count;
            float lowerEstimate = Math.Max(0, forecast.lower_count[index]);
            float estimate = forecast.forecasted_count[index];
            float upperEstimate = forecast.upper_count[index];
            return $"日期: {action_date}\n" +
            $"實際值: {actual_count}\n" +
            $"預測下限估值: {lowerEstimate}\n" +
            $"預測估值: {estimate}\n" +
            $"預測上限估值: {upperEstimate}\n";
        });

Console.WriteLine("預測結果");
Console.WriteLine("---------------------");
foreach (var prediction in forecastOutput)
{
    Console.WriteLine(prediction);
}

運行結果類似於以下內容:

預測結果
---------------------
日期: 2018-12-01
實際值: 24566.08
預測下限估值: 16791.379
預測估值: 20394.115
預測上限估值: 23996.852

 

完成!

六、延伸內容

ML.net包含了很多機器學習的內容。其中,我自己認為時序預測是用途很廣的一個部分,可以用在

  • 銷售預測
  • 庫存預警
  • 活動策劃輔助

以及其它諸如天氣、股票、人口等諸多內容上,依靠過去和現在的數據,分析兩者之間的關係,然後利用得到的這個關係去預測未來的數據。

因此,在這個分類中,我的第一篇文章就寫了時序預測。

 

機器學習,核心是各種算法,而算法的基礎是一類數學。這是一個很高的坎。刷算法,線性的部分還好,一旦到了冪次或矩陣,沒有正統的學習,是很難有突破的。而即便刷通了,也只是皮毛性的理解,距離創造算法的大神,還有很長的距離。

所以,退而求其次,對很多人而言,與其花大功夫去研究算法,不如多研究下如何能把現有的算法或工具用好。

 

還有,在應用中,你能用機器學習來預測銷量、預測庫存,有沒有很自豪?是不是很高大上?

 

(全文完)

 

本文的對應代碼,在https://github.com/humornif/Demo-Code/tree/master/0013/demo

 

 

微信公眾號:老王Plus

掃描二維碼,關注個人公眾號,可以第一時間得到最新的個人文章和內容推送

本文版權歸作者所有,轉載請保留此聲明和原文鏈接

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!

五十二甲溼地再開座談會 地主舌戰環團不歡而散

摘錄自2020年9月23日自由時報報導

面積297公頃的五十二甲溼地,涵蓋冬山、五結、蘇澳3鄉鎮,2015年被公告為「國家級重要濕地」,只是劃入濕地範圍有9成屬於私有地,有1300多名地主權益受影響。23日內政部營建署再度召開座談會,這次邀請環保團體列席表示意見,但環團才剛拿起麥克風發言不久,就遭地主群起砲轟「你們不是地主」,會議秩序一度失控,雙方不歡而散。營建署官員則說,今只是座談會,以蒐集民眾意見為主。

會議開始前,環團主張應保全成興大小池濕地、滯洪功能,另外,應促成在地社區、民間團抵合作經營濕地,顧全農民權益,同時,在核心保育區、生態復育區部分,應改檢討計畫草案的功能分區。

地主則希望政府比照無尾港溼地作法,採徵收、承租方式,彌補地主權益。

不過,會議輪到宜蘭惜溪聯盟召集人康芳銘發言,康主張濕地保育利用計畫草案應檢討功能分區時,點燃地主怒吼,群起制止康芳銘發言,場面一度失控,環團最後退席,表示會以書面方式表達意見。

 

【其他文章推薦】

※哪裡買的到省力省空間,方便攜帶的購物推車?

※廢氣洗滌塔,叫得動, 找得到的專業廠商‎

※市面十大品牌封口機!該如何選購?

※塑膠射出成型加工商品有哪些?

※貨梯使用安全與保養

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

口罩繩易纏動物 動保籲丟棄前先剪掉

摘錄自2020年9月24日公視報導

英國陸續發現有海鷗的雙腳被口罩繩纏住,就像戴了腳鐐一樣。根據統計,全球目前每個月消耗1000多億個拋棄式口罩和手套,對環境造成很大的負擔;動保團體呼籲民眾在丟掉口罩之前,至少先把繩子剪掉,以免傷害無辜的動物。

南韓環境運動聯合會白娜媛說:「一次性口罩是塑料做的,因此幾乎不能分解,因為無法回收,所以不是焚化就是掩埋,這對自然造成巨大負擔。」

英國皇家防止虐待動物協會10號指出,疫情爆發僅半年,他們就救援900多隻因廢棄口罩或塑膠垃圾受困的動物,呼籲大眾丟口罩前先剪斷鬆緊繩,以免纏住動物。

【其他文章推薦】

※新北市探針選用參考標準?

※如何知道自已的電腦cpu支不支持AVX指令集?

※如何正確使用飲水機?

※攻戰消費者第一視覺,包裝設計很重要!

※滑鼠墊適用各種文宣活動廣告曝光,專業客製服務

※封口機購物網-不怕你比價,就怕你買貴!

※高溫殺菌機最多可達多少溫度?

環委要求開發單位在營運前辦理全區土壤網格佈點調查

環委要求開發單位在營運前辦理全區土壤網格佈點調查(含有機及無機污染物),及補充豐水期地下水調查;加強降雨初期滯洪沉砂池放流水處理,以維護海岸藻礁生態;會議決議本案通過初審。

環保署解釋,一般開發案若要辦理變更事項,必須送交環境差異分析(環差)報告審查,若審查未能通過,可依原許可方案繼續開發;但若是3年未開發者,必須送審環境現況差異分析(環現差),未通過則不得開發。

【其他文章推薦】

※無塵擦拭布各大品牌廠商販售比價網!

※如何正確使用飲水機?

※如何知道自已的電腦cpu支不支持AVX指令集?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※精密CNC 自動車床設備介紹

※空壓機這裡買最划算!

桃科二期計畫3年未開發 補環現差報告過初審

摘錄自2020年9月24日中央社報導

行政院環境保護署今(24日)召開「桃園科技工業園區第二期開發計畫環境現況差異分析及對策檢討報告」專案小組初審會議,環保署表示,本案由於通過環評後超過3年全區未施工,因此必須重做環現差。

環保署提到,開發單位為處理本計畫中央農地剔除區變更項目,之前已先提環境差異分析報告,變更開發面積,也導致環現差所須做的調查範圍無法確定,是要依原環評為基礎,或是依變更面積為基礎。

環保署說,直到今年8月,環差報告經環評大會審查後補充修正通過,但若開發單位未通過環現差審查,本案仍不得開發,因此開發單位才以環差報告為基礎,再送環現差報告至環保署。

另外,環委要求開發單位在營運前辦理全區土壤網格佈點調查(含有機及無機污染物),及補充豐水期地下水調查;加強降雨初期滯洪沉砂池放流水處理,以維護海岸藻礁生態;會議決議本案通過初審。

環保署解釋,一般開發案若要辦理變更事項,必須送交環境差異分析(環差)報告審查,若審查未能通過,可依原許可方案繼續開發;但若是3年未開發者,必須送審環境現況差異分析(環現差),未通過則不得開發。

【其他文章推薦】

※客製專屬滑鼠墊、可愛造型L夾、L型資料夾、透明證件套、手提袋,專業印刷設計廠商!  

※示波器鮮為人知的使用技巧?

※掌握產品行銷策略,帶你認識商品包裝設計基本要素

※買不起高檔茶葉,精緻包裝茶葉罐,也能撐場面!

※貨梯使用安全與保養

※高效率洗滌塔活性碳設備有哪些?

※專業模具開發-五金製品代工製作廠

福島核電廠淨化核污水 檢出半衰期1570萬年超標碘129

摘錄自2018年8月20日中央社報導

日本媒體報導,2011年發生核子事故的福島第一核電廠所淨化的核污水,除了氚以外,還被檢測出其他放射性物質,包括半衰期長達1570萬年的碘129。

共同社報導,福島縣知事內堀雅雄今天(20日)表示,有關這個問題,希望中央政府與營運福島第一核電廠的東京電力公司,能仔細說明水質狀況數據,及對環境與當地形象會造成什麼影響。

東電公司表示,2017年度使用放射性廢水處理系統(ALPS)淨化含氚水後的檢測結果顯示,半衰期約1570萬年的碘129,每公升最多檢出62.2貝克,比標準值多9貝克。

關於如何處理持續聚積在福島第一核電廠內的含氚水,基於對人體影響較小等原則,日本政府已設置小委員會全面展開討論,月底也將舉行傾聽國民意見的聽證會;但關於氚以外的放射性物質則幾乎沒被討論。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

川普開倒車? 各州可自訂碳排標準

摘錄自2018年8月20日自由時報報導

美國總統川普近日將宣布一項新方案,授權各州自行決定如何與是否遏制燃煤發電廠的碳排放,大幅翻轉前朝歐巴馬政府的「潔淨電力計畫」(Clean Power Plan)。然而,根據美國環保署就未來十年溫室氣體排放量的推估,落實川普新措施後的排放量,將是歐巴馬乾淨能源政策的至少12倍。

新計畫將授權各州自行對火力發電廠制定標準較低的法規,還允許各州退出電廠排放法規,將對全美各地許多老舊燃煤發電廠帶來重大影響,恐導致曾一度減少的溫室氣體排放再度升高。

新措施將影響超過300座發電廠,鼓勵業者讓這些火力發電廠繼續運轉,而非以更乾淨的天然氣或再生能源發電取而代之。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※教你寫出一流的銷售文案?

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※回頭車貨運收費標準

※別再煩惱如何寫文案,掌握八大原則!

※超省錢租車方案

※產品缺大量曝光嗎?你需要的是一流包裝設計!